检查是否存在Django模型字段选择

时间:2010-03-26 01:22:33

标签: python django django-models

我正在尝试检查为模型字段设置的选择元组中是否存在值。

例如,假设我有一个这样的模型:

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 个答案:

答案 0 :(得分:11)

  1. 您确定要将值设置为“Up”吗?这是一个显示值,您可能有兴趣将值设置为-1或1

  2. 您可以通过将选择列表转换为dict来轻松检查选项是否在列表中。

    my_choice in dict(VOTE_TYPE)

  3. 如果可能,您可以使用choiceField或TypedChoiceField,他们将验证选择列表中是否存在给定值。

答案 1 :(得分:2)

首先,models.SmallIntegerField不能有max_length选项。这仅用于CharField及其衍生物。其次,根据documentationchoices选项主要由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)

所有新项目可能都使用 TextChoicesIntegerChoices。 由于它继承自内置 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