【问题标题】:Does model.CharField('blank=False') work with save()?model.CharField('blank=False') 是否与 save() 一起使用?
【发布时间】:2009-09-17 01:35:24
【问题描述】:

我在 Django 1.1 中有一个这样的模型:

class Booking(models.Model):
  name = models.CharField(max_length=100)

默认情况下,我读到“null”和“blank”都是 False。

所以通过这样的测试......

class SimpleTest(TestCase):
    def test_booking_save(self):
        b = Booking()
        b.save()

... 我预计保存会引发异常。但事实并非如此。用空白名称创建新记录(Postgres 和 SQLite3)似乎很高兴。

我注意到,通过管理界面保存确实会失败,并显示“此字段是必需的”。

问题是:

  1. “空白”属性是否仅适用于表单?
  2. 修复是否覆盖 save() 方法并明确检查 len(name) != 0?
  3. 我是否误解了一些曾经能解决我误解的东西?

【问题讨论】:

标签: django django-models


【解决方案1】:

更新:查看最新 Django 版本中的model validation documentation

原答案blank=True/False only applies to forms。数据验证目前只发生在表单级别;当model-validation Google Summer of Code work 合并到主干时,这将改变。

目前在模型层发生的唯一一种验证是,如果数据库后端无法处理得到的结果,它会抛出什么错误。对于空 CharField,您通常永远不会从数据库中收到错误,因为 Django 默认将该字段设置为空字符串。

现在,您应该使用 save() 方法进行任何您想要的模型级验证。很快(如果你在trunk上)或者当 1.2 出来时,使用模型验证的东西。

【讨论】:

  • 这似乎是一个旧答案,但问题似乎仍然相关?这里到底发生了什么?
【解决方案2】:

来自Django Docs

“请注意,空字符串值将始终存储为空字符串,而不是 NULL。仅对非字符串字段(如整数、布尔值和日期)使用 null=True。”

您的代码正在存储一个空字符串。

为了说明这一点,请尝试:

class SimpleTest(TestCase):
    def test_booking_save(self):
        b = Booking()
        b.name = None
        b.save()

【讨论】:

  • 正确,但没有回答所提出的问题。
  • 是的,它确实存储了一个空字符串。那就是问题所在。由于“空白”设置为“假”,我希望它可以防止这种情况发生。
猜你喜欢
  • 2012-09-01
  • 2012-04-13
  • 2018-12-15
  • 2012-03-09
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多