it-roy-ru.com

Django: доступ к кортежу заданного поля

Я хотел бы получить именованные значения поля выбора для выбора, который в настоящее время не выбран. Это возможно?

Например: models.py

FILE_STATUS_CHOICES = (
    ('P', 'Pending'),
    ('A', 'Approved'),
    ('R', 'Rejected'),
)

class File(models.Model):
    status = models.CharField(max_length=1, default='P', choices=FILE_STATUS_CHOICES)

views.py

f = File()
f.status = 'P'
f.save()

old_value = f.status

print f.get_status_display()
> Pending

f.status = 'A'
f.save()

new_value = f.status

print f.get_status_display()
> Approved

Как я могу получить старое отображаемое значение от 'P' до 'Pending?' Я могу сделать это, создав форму в представлении и получив доступ к ее словарю значений/меток. Это лучший/единственный подход?

23
Furbeenator

Это в значительной степени нормально, чтобы импортировать ваш выбор отображения FILE_STATUS_CHOICES из моделей и использовать его для получения Pending от P:

from my_app.models import FILE_STATUS_CHOICES

print dict(FILE_STATUS_CHOICES).get('P')

Метод get_FIELD_display() в вашей модели, по сути, делает то же самое:

def _get_FIELD_display(self, field):
    value = getattr(self, field.attname)
    return force_text(dict(field.flatchoices).get(value, value), strings_only=True) 

И, поскольку в поле модели есть поле flatchoices, вы можете использовать его с помощью методов _meta и get_field_by_name():

choices = f._meta.get_field_by_name('name')[0].flatchoices
print dict(choices).get('P')

где f - это экземпляр вашей модели.

Также см:

44
alecxe

Я рекомендую использовать Choice из Django-model-utils: https://Django-model-utils.readthedocs.io/en/latest/utilities.html#choices .

Я использую его в каждой моей модели, если мне нужно поле выбора. Смотрите примеры, у него есть отличные варианты.

0
Ibrohim Ermatov