Django: как добавить пользовательскую проверку в функцию `validate_constaints` с учетом экземпляра, который еще не был зафиксирован?

Я хотел бы использовать это ограничение в моей модели Django:

models.UniqueConstraint(
    fields=["edificio", "studio"],
    condition=models.Q(attiva=True),
    name="unique_attiva_per_edificio_studio",
    violation_error_message=_(
        "cannot have two active configurations for the same studio",
    ),
)

Но поскольку я работаю на MariaDB (и не могу изменить это), условные ограничения/индексы пока не поддерживаются. Поэтому я расширяю функцию validate_constraints в моей модели EdificioConfigurazione, чтобы проверить это.

def validate_constraints(self, exclude=None):
    super().validate_constraints(exclude)

    # TODO: this will be removed once MySQL/MariaDB supports conditional constraints
    manager = EdificioConfigurazione.objects
    multiple_attiva_per_edificio = (
        manager.values("edificio", "studio")
        .annotate(
            rcount=models.Count("id", filter=models.F("attiva")),
        )
        .filter(rcount__gt=1)
    )
    if multiple_attiva_per_edificio.exists():
        violation_error_message = _(
            "cannot have two active configurations for the same studio",
        )
        raise ValidationError(violation_error_message)

Предполагая, что это правильный подход (я открыт для предложений), я не могу обеспечить эту проверку, поскольку добавляемый/изменяемый экземпляр (который является self) еще не зафиксирован в БД. Как я могу использовать этот экземпляр? Моя идея заключается в том, чтобы посмотреть на поле self.pk и:

  • if self.pk is None: я добавляю экземпляр в кверисет до проверки
  • .
  • else: экземпляр уже находится в БД (например, я его модифицирую), поэтому мне нужно обновить набор запросов, чтобы использовать его вместо зафиксированного.

Опять же, я не знаю, является ли расширение validate_constraints правильным подходом, но как бы я реализовал эту логику?

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