0

我正在尝试创建一个约束来检查两个字段是否都具有虚假值。这些字段之一是布尔值,另一个是 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为空Truetarget_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 添加它,所以我试图在模型级别验证它。

我很欣赏任何见解。

4

1 回答 1

0

django 管理员对ManyToMany字段的更改与更改实际对象是分开的。

请记住,m2m它保存在不同的数据库表中。

from django.contrib import admin

@admin.register(Test)
class TestAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        # wrire your code here
        super().save_model(request, obj, form, change)

你可以参考文档

于 2022-02-17T22:47:25.533 回答