Валидация внешних ключей в моделях 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
мог только GoForAWalk
с одним из своих Dog
.
В настоящее время любой владелец может пойти на прогулку с любой собакой.
Вы можете ограничить это через валидаторы модели или через некоторую логику во время создания нового GoForAWalk
объекта?
Может ли кто-нибудь привести пример? Я совсем запутался.
Большое спасибо!
Выпьем, Филипп
GoForAWalk
не нуждается в owner
, так как "идет в комплекте" с dog
, поэтому если собака идет гулять, вы уже знаете, с кем. Просто удалите owner
из GoForAWalk
. Это устранит возможные несоответствия.
Вы можете выполнить валидацию в методе 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, вероятно, можно сделать что-то с новым Model Constraint: https://docs.djangoproject.com/fr/4.1/ref/models/instances/#validating-objects