web-dev-qa-db-ja.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」から「保留」にするにはどうすればよいですか?ビューでフォームを作成し、その値/ラベルのディクショナリにアクセスすることで、そうすることができるかもしれません。これは最善の/唯一のアプローチですか?

26
Furbeenator

これは、モデルから_FILE_STATUS_CHOICES_の選択マッピングをインポートし、それを使用してPending by 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はモデルインスタンスです。

以下も参照してください:

47
alecxe

Django-model-utilsChoiceを使用することをお勧めします: https://Django-model-utils.readthedocs.io/en/latest/utilities.html#choices

選択フィールドが必要な場合は、すべてのモデルで使用します。例を参照してください。優れたオプションがあります。

0
Ibrohim Ermatov