gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:39:31 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com