Django: 如何访问给定字段的选项元组?

36
我想获取选择字段中未被选中的选项的命名值,这是否可能?
例如: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)

视图.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”获取旧的显示值?我可以通过在视图中创建一个表单并访问其值/标签字典来实现。这是最好/唯一的方法吗?

如何从“P”到“Pending”获取旧的显示值?我可以通过在视图中创建一个表单并访问其值/标签字典来实现。这是最好/唯一的方法吗?


一旦执行 f.save(),该值将被覆盖。除非您在内存中保留了该对象,否则无法检索旧值。 - karthikr
谢谢,@karthikr,但是我能否得到旧值的显示值?我能够访问在模型层中分配给choices的元组吗?我想如果我知道对象,我可以获取字段的choices参数并从models.py中获取常量元组。好奇是否有其他捷径可以这样做。 - Furbeenator
我不相信有任何辅助方法可以做到那一点。这个问题概述了你可以自己完成的一些方法。 - dgel
谢谢,dgel。我正在使用@alecxe提出的方法,从实例的._meta字段和其flatchoices属性中获取元组。 - Furbeenator
2个回答

59

您可以从模型导入自己选择的映射FILE_STATUS_CHOICES,然后使用它通过P获取Pending

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是您的模型实例。

另请参见:


flatchoices是表单元素的一部分吗?当我对实际文件对象执行操作时,状态返回单个字符Unicode“P”,似乎没有flatchoices属性。如果是这样,我可以设置一个表单,然后从那里获取flatchoices,对吗? - Furbeenator
@Furbeenator,是的,对不起,应该首先获取实际字段:请检查更新后的答案。 - alecxe
太棒了,我已经解决了这个问题,然后看到了你的更新。非常感谢,这让我摆脱了困境! - Furbeenator
在模板中如何访问它们? - pitchblack408

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接