【问题标题】:Why should I set max_length when using Choices in a Django model?为什么在 Django 模型中使用 Choices 时应该设置 max_length?
【发布时间】:2018-11-04 22:44:17
【问题描述】:

在官方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 因为数据库需要知道分配给该字段的字符数。
  • 我的意思是,如果设置了“A”或“RU”等未在选项中定义的值,该模型会引发异常吗?

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


【解决方案1】:

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

它们是相互独立的。

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

但如果你使用 djangos 表单,choices 验证会为你完成(表单调用 full_clean()),你不必担心。


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

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

【讨论】:

  • 哦,谢谢。所以现在你认为我使用正则表达式验证器来确保它是选项之一更好吗?
  • 不,验证器运行在与choices 验证相同的级别(python 代码)。只要你使用表单或调用instance.full_clean()choices 验证就会完成,不需要其他验证器。
猜你喜欢
  • 2012-07-22
  • 1970-01-01
  • 2014-12-15
  • 2015-08-22
  • 2010-12-21
  • 2021-04-23
  • 1970-01-01
  • 2021-02-19
相关资源
最近更新 更多