Django:访问给定字段的选择元组
Posted
技术标签:
【中文标题】Django:访问给定字段的选择元组【英文标题】:Django: Access given field's choices tuple 【发布时间】:2013-09-13 09:45:08 【问题描述】:我想获取当前未选择的选项的选项字段的命名值。这可能吗?
例如: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”变为“待定”?我可以通过在视图中创建一个表单并访问其值/标签字典来做到这一点。这是最好/唯一的方法吗?
【问题讨论】:
一旦您执行f.save()
,该值将被覆盖。除非您在内存中有对象,否则无法检索旧值
谢谢@karthikr,但是我可以得到旧值的显示值吗?我可以访问分配给模型层中选择的元组吗?我想如果我知道对象,我可以获取字段的选择参数并从 models.py 中获取常量元组。好奇是否有任何其他捷径可以做到这一点。
我不相信有任何帮助方法。 This question 概述了您可以自己完成的一些方法。
谢谢,dgel。我正在使用@alecxe 概述的方法从实例的 ._meta 字段及其 flatchoices 属性中获取元组。
【参考方案1】:
从模型中导入您的选择映射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
是您的模型实例。
另见:
Django get display name choices【讨论】:
flatchoices 是表单元素的一部分?当我对实际文件对象执行此操作时,状态返回单字符 unicode 'P',它似乎没有 flatchoices 属性。如果是这种情况,我可以设置一个表格,然后从那里获取平面选项,对吗? @Furbeenator 是的,对,对不起,应该先获取实际字段:检查更新的答案。 太棒了,我想通了,然后看到了你的更新。非常感谢,这让我摆脱了困境! 如何在模板中访问它们?【参考方案2】:我建议使用来自django-model-utils
的Choice
:https://django-model-utils.readthedocs.io/en/latest/utilities.html#choices。
如果我需要选择字段,我会在我的每个模型中使用它。看例子,它有很好的选择。
【讨论】:
以上是关于Django:访问给定字段的选择元组的主要内容,如果未能解决你的问题,请参考以下文章
如何在 django 模板的 forloop 中访问 If 语句中的元组值?
Django - 如果国家/地区字段等于美国,则发送 ajax 请求以将状态选择器设置为美国各州的元组
如何防止在 Django Admin 中对 FK / MTM 字段进行自我(递归)选择
Python - 将枚举转换为 Django 模型。CharField 选择元组 [重复]