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)
Вы можете обратиться к документам