我正在尝试创建一个约束来检查两个字段是否都具有虚假值。这些字段之一是布尔值,另一个是 m2m,如下所示:
class Test(models.Model):
public = models.BooleanField(default=False)
target_groups = models.ManyToManyField("TargetGroup", blank=True)
class Meta:
constraints = [
models.CheckConstraint(
name="%(app_label)s_%(class)s_check_public_or_target_groups",
check=Q(public=False, target_groups__isnull=True)
)
]
这让我'constraints' refers to a ManyToManyField 'target_groups', but ManyToManyFields are not permitted in 'constraints'.
无论如何我可以在创建/更新时检查是否public
为空True
?target_groups
我检查了这个和这个。
例如,我尝试对save
方法进行验证,如下所示:
def save(self, *args, **kwargs):
if self.public is False and not self.target_groups.exists():
raise ValidationError(
{"public": _("Notification requires either setting public boolean to true, or providing target groups.")}
)
return super().save(*args, **kwargs)
但是条件self.target_groups
总是假的,我认为这是有道理的,因为对象还没有添加到集合中,但是我如何验证从请求中传入的数据呢?我使用 DRF,我已经可以在序列化程序上验证它,但是管理员也可以通过 Django admin 添加它,所以我试图在模型级别验证它。
我很欣赏任何见解。