gpt4 book ai didi

python-3.x - 如何告诉 Django 模型只有一个或其他字段必须不为空?

转载 作者:行者123 更新时间:2023-12-02 02:07:44 25 4
gpt4 key购买 nike

使用 Django models.Model 类:

class OrderLign(models.Model):
Order = models.ForeignKey(Order,on_delete=models.CASCADE)
Item = models.ForeignKey(Item, on_delete=models.RESTRICT, blank=True, default=0, null=True)
Pack = models.ForeignKey(Pack,on_delete=models.RESTRICT, blank=True, default=0,
null=True)

我需要只有在设置了 Item OR Pack 时才可以保存 OrderLign,不能同时设置,也不能两者都不设置。

最佳答案

您可以添加覆盖 clean() method [Django-doc]检查这个。

此外,我们可以使用 Django's constraint API 添加数据库约束并使用 CheckConstraint [Django-doc] .如果数据库支持这一点,它将拒绝两个 ForeignKey 都没有的条目,或者如果两个都不是 None:

from django.core.exceptions import ValidationError
from django.db.models import Q

class OrderLign(models.Model):
order = models.ForeignKey(
Order,
on_delete=models.CASCADE
)
item = models.ForeignKey(
Item,
on_delete=models.RESTRICT,
blank=True,
null=True
)
pack = models.ForeignKey(
Pack,
on_delete=models.RESTRICT,
blank=True,
null=True
)

def clean(self, *args, **kwargs):
if (self.item is None) == (self.pack is None):
raise ValidationError('item or pack should be filled in')
return super().clean(*args, **kwargs)

class Meta:
constraints = [
models.CheckConstraint(
check=Q(item=None, pack__isnull=False) |
Q(pack=None, item__isnull=False),
name='one of the two not null'
)
]

关于python-3.x - 如何告诉 Django 模型只有一个或其他字段必须不为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68165037/

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