gpt4 book ai didi

python - Django 的两个字段之一不能为空

转载 作者:太空狗 更新时间:2023-10-30 02:24:30 26 4
gpt4 key购买 nike

我有一个类似于这个的模型:

class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
field1= models.IntegerField(null=True)
field2 = models.IntegerField(null=True)

字段 field1field2 中至少有一个不能为空。我如何在模型中验证它?

最佳答案

模型.clean

通常在 Model.clean [Django-doc] 中编写此类测试:

from django.core.exceptions import ValidationError

class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
field1= models.IntegerField(null=True)
field2 = models.IntegerField(null=True)

def clean(self):
super().clean()
if self.field1 is None and self.field2 is None:
raise ValidationError('Field1 or field2 are both None')

请注意,当您.save() 模型时,默认情况下不会验证此干净方法。它通常仅由在此模型之上构建的 ModelForm 调用。您可以修补 .save() 方法 for example like here在您 .save() 模型实例时强制执行验证,但仍然有办法通过 ORM 来规避这一点。

django-db-constraints(部分数据库不支持)

如果您的数据库支持它(例如 MySQL simply ignores the CHECK constraints ),SQL 会提供添加额外约束的语法,以及一个 Django 包 django-db-constraints [GitHub]提供了一些工具来指定此类约束,例如:

class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
field1= models.IntegerField(null=True)
field2 = models.IntegerField(null=True)

class Meta:
db_constraints = {
'field_null': 'CHECK (field1 IS NOT NULL OR field2 IS NOT NULL)',
}

更新:Django 约束框架

, 你可以使用 Django constraint framework [Django-doc] .使用此框架,您可以指定数据库约束,如果数据库支持,则在数据库端进行验证。因此,您可以使用 CheckConstraint [Django-doc] 检查两个字段中的至少一个是否不是 NULL :

class Person(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
field1= models.IntegerField(null=True)
field2 = models.IntegerField(null=True)

class Meta:
constraints = [
models.CheckConstraint(
<b>check=Q(field1__isnull=False) | Q(field2__isnull=False)</b>,
name='not_both_null'
)
]

关于python - Django 的两个字段之一不能为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53085645/

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