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

标签 django validation django-models django-forms django-2.0

在官方Django 2 tutorial我找到了这个:

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,
    )

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

最佳答案

max_length 在数据库级别强制执行,但 choices 在 python 代码级别强制执行(调用 full_clean()clean_<fieldname>() 时)。

它们彼此独立。

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

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

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

这种分离很有用,例如,如果您想稍后添加更多选择;如果新选项不大于 max_length ,将不需要更改数据库结构(也就是说,新的迁移将 NOT 发出 alter table SQL 语句)。

关于django - 在 Django 模型中使用 Choices 时,为什么要设置 max_length?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50530794/

相关文章:

python - 在 Django 中获取和显示相关对象

python - Django 中的菜单选项卡突出显示问题

python - 每个应用程序的 django 设置 - 最佳实践?

javascript - Django:更改 javascript 函数内的字体颜色

Django channel 无法在控制台中记录异常

python - like() 得到了意外的关键字参数 'story_id'

c# - 仅对具有最小长度的数字进行 RegEx 验证

web-services - 使用 SSL 的轴客户端调用

ruby-on-rails - 验证接受始终失败

python - 如何使用 Django ORM 计算从出生年份到注册日期的用户年龄