模型层中的 Django ManyToMany 验证

Django ManyToMany validation in model layer

我有一个带有 manytomany 字段的模型,任务是在模​​型层进行验证。当我运行这段代码时,出现这个错误: ValueError at /admin/main/boss/add/ "<Boss: Senior>" needs to have a value for field "boss_id" before 在 Django 文档中,我发现要使用 m2m 字段,我需要创建 object.But 我无法在没有验证的情况下创建模型对象,这需要 m2m 字段。

我做了研究,在所有其他情况下,他们建议在表单层创建验证。但问题是,当我将在 djangoadmin 中或使用播种器创建对象时,保存的数据可能会导致问题。所以我决定在模型层进行验证。 这是我的模型:

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 或在保存新实例之前)。