在官方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/