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 字段,您可以借助_metaget_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-utilsChoice:https://django-model-utils.readthedocs.io/en/latest/utilities.html#choices。

如果我需要选择字段,我会在我的每个模型中使用它。看例子,它有很好的选择。

【讨论】:

以上是关于Django:访问给定字段的选择元组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 django 模板的 forloop 中访问 If 语句中的元组值?

Django - 如果国家/地区字段等于美国,则发送 ajax 请求以将状态选择器设置为美国各州的元组

如何防止在 Django Admin 中对 FK / MTM 字段进行自我(递归)选择

Python - 将枚举转换为 Django 模型。CharField 选择元组 [重复]

Django 迁移错误:错误:“选择”必须是可迭代的(例如,列表或元组)

django queryset union 不能仅使用