Django模型选择不会因无效选择而引发错误

Gui*_*ent 5 python django

我在Django中有一个带有选择字段的对象

class CustomFieldType(models.Model):
    STRING = 'STRING'
    DATE = 'DATE'
    BOOLEAN = 'BOOLEAN'
    NUMERIC = 'NUMERIC'
    EMAIL = 'EMAIL'
    TYPE_CHOICES = (
        (STRING, _('String')),
        (DATE, _('Date')),
        (BOOLEAN, _('Boolean')),
        (NUMERIC, _('Numeric')),
        (EMAIL, _('Email'))
    )
    name = models.CharField(max_length=256)
    field_type = models.CharField(choices=TYPE_CHOICES, default=STRING, max_length=10)
    company = models.ForeignKey('Company')

    class Meta:
        unique_together = ('name', 'company')

    def __unicode__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

在我的django控制台中

$> CustomFieldType.objects.create(name='custom_name',field_type='noError',company=mycompany)
<CustomFieldType: custom_name>
$> CustomFieldType.objects.get(name='custom_name').field_type
u'noError'
Run Code Online (Sandbox Code Playgroud)

为什么django没有引发错误(ValidationError)?还是我错过了什么?

Bur*_*lid 8

choices选项仅用于预填充表单下拉字段; 它不会强制执行任何验证:

如果给出了此选项,则默认表单窗口小部件将是具有这些选项的选择框,而不是标准文本字段.

  • 有没有办法强制执行验证? (2认同)
  • @ user1631075数据库不应该验证任何东西.所有验证都应在将数据输入数据库之前进行.如果您希望数据库进行验证,则表明您的设计格式不正确. (2认同)
  • @Diemuzi这是不正确的,或者我们对单词验证使用了不同的含义。我的意思是,如果数据库没有验证最大长度的含义,或者整数字段vs charfields vs booleanfields vs等。数据库应该是事实的唯一来源。宇宙的永恒定律是数据比应用程序持久。这就是为什么随着时间的流逝,Django为构建数据库级约束添加了越来越多的支持。https://docs.djangoproject.com/en/dev/ref/models/constraints/#module-django.db.models.constraints (2认同)