首页 > 解决方案 > 处理不可为空的模型字段上的空白 ('') 字符串值的最佳做法是什么?

问题描述

在 Django/postgres 中,如果您有一个不可为空的字段,仍然可以为某些字段类型(例如,)存储一个空白str值。''CharFieldTextField

注意我不是指blank=False,它只是确定该字段是否required在 modelForm 中呈现。我的意思是文字空白字符串值。

例如,考虑这个简单的模型,它null=False具有CharField

class MyModel(models.Model):
    title = models.CharField('title', null=False)

以下抛出IntegrityError

MyModel.objects.create(title=None)

虽然以下没有,但会创建对象:

MyModel.objects.create(title='')

这是将 postgres 与 Django 结合的意外结果,还是有意/它有什么实际用途?

如果这是无意的,处理这个问题的最佳做法是什么?应该 everyCharFieldTextFieldwithnull=False也有一个CheckConstraint? 例如

Class Meta:
    constraints = [
        models.CheckConstraint(
            check=~models.Q(title=''),
            name='title_required'
        )
    ]

标签: djangopostgresqldjango-models

解决方案


来自 Django 文档:

https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.Field.null

“避免在基于字符串的字段(如 CharField 和 TextField)上使用 null。如果基于字符串的字段具有 null=True,则意味着它有两个可能的“无数据”值:NULL 和空字符串。在大多数情况下, “没有数据”有两个可能的值是多余的;Django 约定是使用空字符串,而不是 NULL。”

这是因为存在一个普遍的误解,即 '' = NULL 并且 Django 决定采用它。我个人认为这是一个糟糕的决定,但确实如此。长度为 0 的字符串仍然是一个值,整数 = 0 也是如此。


推荐阅读