检查Django模型字段选择是否存在
我正在尝试检查一个值是否存在于模型字段的选项元组中。
比如说,我有一个这样的模型:
class Vote(models.Model):
VOTE_TYPE = (
(1, "Up"),
(-1, "Down"),
)
value = models.SmallIntegerField(max_length=1, choices=VOTE_TYPES)
现在假设在某个视图中,我有一个变量 new_value = 'Up'
,我想把它用作新投票的值字段。我该如何先检查这个变量的值是否存在于 VOTE_TYPE 元组中呢?
3 个回答
2
首先,models.SmallIntegerField
这个字段是不能设置 max_length
选项的。这个选项只适用于 CharField
及其衍生类型。其次,根据文档,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 元组来验证数据。
4
所有新的项目可能都会使用 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
15
你确定要把值设为“Up”吗?这个是显示用的值,你可能更想把值设为-1或1。
你可以很简单地检查一个选择是否在列表里,只需要把选择列表转换成字典,比如:
my_choice in dict(VOTE_TYPE)
如果可以的话,你可以使用choiceField或TypedChoiceField,它们会验证你给的值是否在选择列表中。