我正在尝试检查为模型字段设置的选择元组中是否存在值。
例如,假设我有一个这样的模型:
class Vote(models.Model):
VOTE_TYPE = (
(1, "Up"),
(-1, "Down"),
)
value = models.SmallIntegerField(max_length=1, choices=VOTE_TYPES)
现在让我们在一个视图中说我有一个变量new_value = 'Up'
,我想用它作为新投票中的值字段。我怎样才能首先检查VOTE_TYPE元组中是否存在该变量的值?谢谢。
答案 0 :(得分:11)
您确定要将值设置为“Up”吗?这是一个显示值,您可能有兴趣将值设置为-1或1
您可以通过将选择列表转换为dict来轻松检查选项是否在列表中。
my_choice in dict(VOTE_TYPE)
如果可能,您可以使用choiceField或TypedChoiceField,他们将验证选择列表中是否存在给定值。
答案 1 :(得分:2)
首先,models.SmallIntegerField
不能有max_length
选项。这仅用于CharField
及其衍生物。其次,根据documentation,choices
选项主要由Django用于管理站点。也就是说,您可以选择将models.py
文件中的VOTE_TYPE元组导入views.py
文件,然后检查值 - 例如:
models.py
...
VOTE_TYPE = ( (1, "Up"), (-1, "Down"), )
views.py
...
from app.models import VOTE_TYPE
for k,v in VOTE_TYPE:
if v == new_value:
return True
另外,如果我没记错,您可以从模型中创建ModelForm
,然后将值传递给所述表单,该表单应根据VOTE_TYPE元组验证数据。
答案 2 :(得分:1)
所有新项目可能都使用 TextChoices
或 IntegerChoices
。
由于它继承自内置 enum.Enum
,您现在可以按照直觉告诉您的方式检查它。
from django.db.models import TextChoices
class ExampleChoices(TextChoices):
example_a = "a"
example_b = "b", "display_b"
>>> "a" in ExampleChoices
True
>>> "b" in ExampleChoices
True
>>> "display_b" in ExampleChoices
False