django - 处理不可为空的模型字段上的空白 ('') 字符串值的最佳做法是什么?
问题描述
在 Django/postgres 中,如果您有一个不可为空的字段,仍然可以为某些字段类型(例如,)存储一个空白str
值。''
CharField
TextField
注意我不是指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 结合的意外结果,还是有意/它有什么实际用途?
如果这是无意的,处理这个问题的最佳做法是什么?应该 everyCharField
和TextField
withnull=False
也有一个CheckConstraint
? 例如
Class Meta:
constraints = [
models.CheckConstraint(
check=~models.Q(title=''),
name='title_required'
)
]
解决方案
来自 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 也是如此。
推荐阅读
- assembly - 在 x86 程序集中写入 .bss 部分
- julia - Julia 1.0 的环境变量
- haskell - 收到错误“约束中的非类型变量参数:积分 [a2]”
- arrays - 浮点数组到字节数组和 Vise Versa
- excel - 使用单元格列从列表中删除高异常值。大批?链表?用于 Excel 的 VBA
- node.js - Node、Express 和 MongoDB 中的套接字挂断
- php - 使用 PHP 更新许多匹配的子文档
- python-3.x - 在 DataFrame 中选择确切的值
- java - 将 EGit 和 GitLab 用于多个项目
- python - 如何在 Python Pandas 中跳过表格上方的行