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

5 投票
3 回答
9614 浏览
提问于 2025-04-15 20:52

我正在尝试检查一个值是否存在于模型字段的选项元组中。

比如说,我有一个这样的模型:

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

所有新的项目可能都会使用 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 
15
  1. 你确定要把值设为“Up”吗?这个是显示用的值,你可能更想把值设为-1或1。

  2. 你可以很简单地检查一个选择是否在列表里,只需要把选择列表转换成字典,比如:

    my_choice in dict(VOTE_TYPE)

  3. 如果可以的话,你可以使用choiceField或TypedChoiceField,它们会验证你给的值是否在选择列表中。

撰写回答