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" в "Ожидание?"? Я могу сделать это, создав форму в представлении и получив доступ к ее словарю значений/меток. Это лучший/единственный подход?
Ответы
Ответ 1
Это довольно хорошо, чтобы импортировать ваше выборное отображение 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
- ваш экземпляр модели.
Также смотрите:
Ответ 2
Я рекомендую использовать Choice
от django-model-utils
: https://django-model-utils.readthedocs.io/en/latest/utilities.html#choices.
Я использую его в каждой моей модели, если мне нужно поле выбора. См. Примеры, он имеет отличные варианты.