在 Django 模型中使用 Choices 时,为什么要设置 max_length?

lad*_*bug 6 django validation django-models django-forms django-2.0

在官方的Django 2 教程中,我发现了这个:

from django.db import models

class Student(models.Model):
    FRESHMAN = 'FR'
    SOPHOMORE = 'SO'
    JUNIOR = 'JR'
    SENIOR = 'SR'
    YEAR_IN_SCHOOL_CHOICES = (
        (FRESHMAN, 'Freshman'),
        (SOPHOMORE, 'Sophomore'),
        (JUNIOR, 'Junior'),
        (SENIOR, 'Senior'),
    )
    year_in_school = models.CharField(
        max_length=2,
        choices=YEAR_IN_SCHOOL_CHOICES,
        default=FRESHMAN,
    )
Run Code Online (Sandbox Code Playgroud)

现在我的问题是使用选择是否意味着只有四个定义的值中的一个对该字段有效?如果是这样,指定 有max_length什么用?如果不是,为什么不使用验证器来验证值是否实际上是指定值之一,或者至少是只接受特定长度而不仅仅是上限的验证器。

Ral*_*alf 8

max_length是在数据库级执行,但是choices在Python代码级执行(呼叫时full_clean()clean_<fieldname>())。

它们彼此独立。

如果您为指定选项以外的字段设置了一个值并且您没有调用instance.full_clean()or instance.clean_<fieldname>(),它仍然可以保存到数据库中而不会引发错误。

但是,如果您使用 djangos 表单,choices验证已为您完成(表单调用full_clean()),您无需担心。


这意味着,例如,如果您在 中设置max_length小于最大选项choices,您的数据库将自动截断该字段的值或引发DatabaseError; 无论哪种方式,你都不会让它工作。

这种分离很有用,例如,如果您想稍后添加更多选择;如果新选项不大于max_length,则无需更改数据库结构(这意味着新迁移不会发出alter tableSQL 语句)。