Валидация внешних ключей в моделях 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

Вернуться на верх