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
правильным подходом, но как бы я реализовал эту логику?