模型层中的 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 或在保存新实例之前)。
我有一个带有 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 或在保存新实例之前)。