gpt4 book ai didi

django - 为什么我可以在不定义所有非空字段的情况下保存 Django 模型实例

转载 作者:行者123 更新时间:2023-11-29 14:27:23 26 4
gpt4 key购买 nike

当我在 Django 中定义一个不可为 null 的字段时,它允许我保存一个模型实例而无需为此不可为 null 的字段指定任何值。这不是我所期望的。我怎样才能强制它产生错误?

Postgres 9.1 Django 2.1 window python 3.6

from django.db import models
class Wwtp(models.Model):
name = models.CharField(max_length=100, null=False,
blank=False, unique=True)
short_name = models.CharField(
max_length=10, null=False, blank=False, unique=True)

正如预期的那样,我不允许使用明确的空 short_name 来保存它。

mdl.Wwtp.objects.create(name='Wwtp4', short_name=None)

但我可以在不指定 short_name 的情况下保存 Wwtp 实例:

mdl.Wwtp.objects.create(name='Wwtp4')

当我尝试时:

mdl.Wwtp.objects.create()

它给了我

django.db.utils.IntegrityError: duplicate key value violates unique constraint "api_wwtp_short_name_key"
DETAIL: Key (short_name)=() already exists.

显然,django 为 short_name 填充了一个空值,但不允许这样做...我如何强制数据库不允许这样做?

最佳答案

你不能用 CharField .空值为空字符串 '' , 不是 NULL .你已经有 blank=False设置,所以如果您在保存模型或模型表单之前清理它们,您就会发现。但它不能在数据库级别强制执行。

请注意 blank=False, null=False是默认值,因此您实际上不必指定它。

此外,如果您真的只想支持 PostgreSQL,您可以使用 RunSQL 进行自定义迁移。在表上创建列,手动添加添加约束所需的 SQL(例如使用 CHECK )。参见 here了解如何确保 Django 也知道该列已创建并且不会尝试在下一次迁移中添加它。有一个 example here .

[编辑] 在 Django 2.2 中,你可以添加一个 CheckConstraint在模特的 Meta constraints 属性:

from django.db.models import CheckConstraint, Q

(...)
class Meta:
constraints = [
CheckConstraint(
check=~Q(name=''),
name='name_not_empty'),
CheckConstraint(
check=~Q(short_name=''),
name='short_name_not_empty']

关于django - 为什么我可以在不定义所有非空字段的情况下保存 Django 模型实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56441480/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com