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.