Django为外键验证建模



我有以下Django模型:

class Owner(models.Model):
name = models.CharField(max_length=30)
class Dog(models.Model):
name = models.CharField(max_length=30)
owner = models.ForeignKey(Owner)

class GoForAWalk(models.Model):
date = models.DateTimeField()
location = models.CharField()
owner = models.ForeignKey(Owner)
dog = models.ForeignKey(Dog)

我希望Owner只能用他自己的Dog中的一个GoForAWalk

目前,任何主人都可以和任何狗一起散步。

在创建新的GoForAWalk对象时,您会通过模型验证器或某些逻辑来限制这一点吗?

有人能举个例子吗?我被卡住了。

非常感谢!

干杯,Philipp

GoForAWalk不需要owner,因为它"带有";dog,所以如果狗去散步,你已经知道和谁在一起了。只需从GoForAWalk中删除owner。这将修复可能出现的不一致。

您可以在full_clean方法中对您的模型进行验证:

class GoForAWalk(models.Model):
date = models.DateTimeField()
location = models.CharField()
owner = models.ForeignKey(Owner)
dog = models.ForeignKey(Dog)
def full_clean(self, **kwargs):
super().full_clean(**kwargs)

if self.dog.owner != self.owner:
raise ValidationError(...)

关于full_clean的一些信息:https://docs.djangoproject.com/fr/4.1/ref/models/instances/#django.db.models.Model.full_clean

使用上一个Django版本,可能会使用新的模型约束来制作一些东西:https://docs.djangoproject.com/fr/4.1/ref/models/instances/#validating-对象

最新更新