Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django NULL约束失败_Python_Django_Django Models - Fatal编程技术网

Python Django NULL约束失败

Python Django NULL约束失败,python,django,django-models,Python,Django,Django Models,我希望在不允许null的字段中存储null值后,引发IntegrityError。模型如下: class Domain(models.Model): uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False) name = models.CharField(null=False, max_length=128) d = Domain().save() get_hex_uuid函

我希望在不允许null的字段中存储null值后,引发IntegrityError。模型如下:

class Domain(models.Model):
    uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
    name = models.CharField(null=False, max_length=128)
d = Domain().save()
get_hex_uuid函数可以工作,我已经测试过了。当我开始按如下方式保存域对象时,这一切都失败了:

class Domain(models.Model):
    uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
    name = models.CharField(null=False, max_length=128)
d = Domain().save()

很明显,这两种情况都会引起错误,因为它们的名称值是
None/NULL
,但不会发生这种情况。现在,当我使用Domain.objects.all()选择这些对象中的任何一个时,我确实得到了它们的名称值存储为

>>> d = Domain.objects.all().first()
>>> d.name
>>> ''
所以我开始检查域对象的正常初始化:

>>> d = Domain()
>>> d.name
>>> ''
显然,它默认为
'
。为什么会这样?在我以前的经验中,属性被初始化为
None
NULL

那么为什么对象属性从
''
开始呢。
如何解决此问题?

如果要保持字段值唯一,可以编写如下内容:

name = models.CharField(unique=True, max_length=128)
注意:当您未提及
null
blank
时,其默认值为False,除非您希望允许在模型中存储null值,否则需要使用
null=True

unique=True
将确保输入的字段中没有重复记录

更改模型后,请确保应用迁移

注意:当您从shell执行查询时,并非所有的验证工作(如blank=False)都是默认值,用于确保django admin中的字段是必需的,但当您从shell执行相同的脚本时,它不会引发任何错误,您需要自己覆盖它

要引发异常,您需要覆盖
save()
,如下所示:

class Domain(models.Model):
    uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
    name = models.CharField(null=False, max_length=128)

    def save(self, *args, **kwargs):
        assert self.name, "The 'name' field can not be null it must be populated."
        super().save(*args, **kwargs)

如果要保持字段值唯一,可以编写如下内容:

name = models.CharField(unique=True, max_length=128)
注意:当您未提及
null
blank
时,其默认值为False,除非您希望允许在模型中存储null值,否则需要使用
null=True

unique=True
将确保输入的字段中没有重复记录

更改模型后,请确保应用迁移

注意:当您从shell执行查询时,并非所有的验证工作(如blank=False)都是默认值,用于确保django admin中的字段是必需的,但当您从shell执行相同的脚本时,它不会引发任何错误,您需要自己覆盖它

要引发异常,您需要覆盖
save()
,如下所示:

class Domain(models.Model):
    uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
    name = models.CharField(null=False, max_length=128)

    def save(self, *args, **kwargs):
        assert self.name, "The 'name' field can not be null it must be populated."
        super().save(*args, **kwargs)

我认为你应该使用null=true,blank=false来达到这个效果:

class Domain(models.Model):
    uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
    name = models.CharField(max_length=128, null=True)
通过这样做,您应该期望以下行为:

>>> d1 = Domain.objects.create()
>>> print(d1.name)
None
>>> d2 = Domain()
>>> d2.save()
>>> print(d2.name)
None

您使用的是哪个版本的django?我在
Django==1.11.7
上运行此代码,我认为您应该使用null=true,blank=false来实现此效果:

class Domain(models.Model):
    uuid = models.UUIDField(default=get_hex_uuid, primary_key=True, editable=False)
    name = models.CharField(max_length=128, null=True)
通过这样做,您应该期望以下行为:

>>> d1 = Domain.objects.create()
>>> print(d1.name)
None
>>> d2 = Domain()
>>> d2.save()
>>> print(d2.name)
None

您使用的是哪个版本的django?我在
Django==1.11.7

上运行此代码。问题不是唯一值,而是名称不应为None/nulls,因此是否允许重复名称?是的,uuid是绑定主键。例如:
(63f1ac0f4a784e8d9b649fdeb345f122,'Test')
(2f64b85fc3ac4b37bea58011108e0a17,'Test')
非常好问题不是唯一的值,而是名称不应该是None/null,所以您想允许重复名称吗?是的,uuid是绑定主键。例如:
(63f1ac0f4a784e8d9b649fdeb345f122,'Test')
(2f64b85fc3ac4b37bea58011108e0a17,'Test')
是完美的否,因为这将允许在数据库中有一个空值,这不是想要的行为否,因为这将允许在数据库中有一个空值的可能性,这不是被通缉的行为