Django Валидация ManyToMany в слое модели

У меня есть модель с большим количеством полей и задача состоит в том, чтобы сделать валидацию в слое модели. Я провел исследование и во всех других случаях они рекомендуют создавать валидацию в слое Form. Но проблема в том, что когда я буду создавать объект в djangoadmin или с помощью seeder, сохраненные данные могут вызвать проблемы. Поэтому я решил сделать валидацию в слое модели. Вот моя модель:

class Position(models.Model):
    pos_id = models.BigAutoField(primary_key = True)
    pos_name = models.CharField(max_length=80)
    level = models.IntegerField(default=1)

    def __str__(self) -> str:
        return self.pos_name

    class Meta:
        verbose_name = 'Position'
        verbose_name_plural = 'Positions'


class Boss(models.Model):
    boss_id = models.BigAutoField(primary_key=True)
    boss_position = models.ForeignKey(Position, null=True, on_delete = CASCADE)
    subordinates = models.ManyToManyField(Position,related_name='bosses')

    def __str__(self) -> str:
        return self.boss_position.pos_name

    @property
    def position(self):
        return self.boss_position

    def clean(self) -> None:
        subordinates_list = self.subordinates.objects.all()
        if self.boss_position in subordinates_list:
            raise ValidationError(_('Boss cant be boss in his subordinate list'))


    class Meta:
        verbose_name = 'Boss'
        verbose_name_plural = 'Bosses'

заранее спасибо за ваш ответ

Эта ошибка говорит о том, что вы пытаетесь получить доступ к отношению Many2Many до сохранения вашего объекта в базе данных (т.е. без ID/PK). К сожалению, вы не можете получить доступ к этому Many2Many отношению из вашего поля в чистом методе, если вы не сохранили ваш объект в базе данных. Потому что такие объекты (Many2Many) будут добавлены в ваш экземпляр после того, как вы создадите свои объекты. Так как Django нужно запросить вашу сквозную модель на основе вашего текущего экземпляра, а когда нет ни одного экземпляра, он не может сделать запрос для него, и это основная причина, почему он выдает ошибку.

В принципе, вы не можете иметь доступ к отношению Many2Many объектов (без ID/PK или до сохранения нового экземпляра) ни в модели, ни в чистых методах admin/ModelForm.

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