Django валидация контестатов "многие-ко-многим

Я пытаюсь создать ограничение, которое проверяет, имеют ли оба поля ложные значения. Одно из этих полей является булевым, а другое - 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, так что я пытаюсь проверить это на уровне модели

Я благодарен за любую информацию.

Администратор 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)

Вы можете обратиться к документам

Вернуться на верх