python - 有没有办法根据值查询Django中的枚举类型?

标签 python django django-models enumerated-types

我正在为此摸不着头脑。我的数据库中有一个枚举数据。我的模型有这样的内容:

class SomeModel(models.Model):
    TWOCHOICE = (
    ('YES', 'YES'),
    ('NO', 'NO'),
    ('DK', 'Don't Know'),
    )

myfield = models.IntegerField(max_length=1, choices=TWOCHOICE)

现在当我想查询这个时,我不能使用:

SomeModel.objects.filter(myfield__in = ['YES', 'NO'])

这看起来是最直接的。我必须使用整数值。所以我最终使用了:

SomeModel.objects.filter(myfield__in = [[t[0] for t in SomeModel.TWOCHOICE].index(i) for i in ['YES', 'NO']])

但这还不够。这些字段似乎是从 1 开始索引的!!!!所以我需要类似的东西:

SomeModel.objects.filter(myfield__in = [[t[0] for t in SomeModel.TWOCHOICE].index(i)+1 for i in ['YES', 'NO']])

我只是觉得这样太复杂了。 Django中有没有更好的方法来查询枚举类型?

最佳答案

对于可读性的选择字段,Django 允许您指定两个值,第一个是要存储在数据库中的实际值,第二个将显示在表单等中以提高可读性。例如在

CHOICES = (
    (0, 'No'),
    (1, 'Yes'),
    (2, 'Don\'t Know'),
)

将存储在数据库中的值将是[0,1,2],但是为了可读性,它们的关联字符串将显示在表单等中。

现在就您的问题而言,这里的问题是您正在为 myfield 使用 IntegerField 但试图按字符串进行过滤。每当您执行过滤器查找(filter(...) 或 except(...))时,您必须提供与数据库中存储的内容相关的值。因此,每当您想要过滤 IntegerField 时,您都必须提供一个用于过滤的整数。我不确定为什么 Django 允许您选择第一个值不是整数的 IntegerField,但您可能应该更改它。如果您将使用上面的示例选择值,则可以通过以下方式过滤 yesno:

.filter(myfield__in=[0,1])

如果您想按关联的字符串值进行过滤,确实没有简单的方法。您必须先查找与该字符串相关的存储值。

def lookup_choices(choices, values):
    choices = dict(choices)
    rchoices = {choices [k]: k for k in choices}
    return [rchoices[v] for v in values]

.filter(myfield__in=lookup_choices(CHOICES, ['Yes', 'No'])

但是,您很少需要这样做,因为 Django 将仅使用关联的字符串值来呈现值(选择框),但始终会返回实际值(例如 form.cleaned_data)。

关于python - 有没有办法根据值查询Django中的枚举类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20828551/

相关文章:

python - 获取路径作为用户输入 Python 3

python - 与 OpenMP 一起使用功能时卡住/失败 [Pybind11/OpenMP]

Python从xlrd创建的列表中删除 'text'

python - PyMongo 中使用 server_info() 时出现集合对象不可调用错误

python - 更改 Django 管理员不活动超时

python - 我如何继承 Django CreateView

python - 反转列表的顺序

当检索到的电子邮件与现有用户的电子邮件匹配时,django allauth facebook 重定向到注册?

python - 选择最小值和分组

Django - 反向查询名称冲突