Что лучше: использовать Django Constraints или вызывать ошибку ValueError в методе сохранения?
Я сталкивался с двумя способами принудительного выполнения условия в моделях Django:
Использование метода
save
сValueError
:class MyModel(models.Model): field_name = models.CharField(max_length=100) def save(self, *args, **kwargs): if not self.field_name: # Example condition raise ValueError("Field name cannot be empty.") super().save(*args, **kwargs)
Использование ограничений Django (как
CheckConstraint
) :from django.db import models from django.db.models import Q class MyModel(models.Model): field_name = models.CharField(max_length=100) class Meta: constraints = [ models.CheckConstraint( check=~Q(field_name=""), # Example condition name="field_name_not_empty", ) ]
Я знаю, что оба подхода могут обеспечить выполнение условий, но мне интересно:
- Какой подход более эффективен?
- Какой из них лучше использовать в реальных сценариях?
Для краткого ответа, в данном случае, я бы использовал второй вариант.
Для более подробного ответа:
Вызвать исключение в Python:
Использование метода сохранения с ValueError проверяется в коде python, это может увеличить накладные расходы при каждом вызове метода сохранения, и он не будет оценивать вставленные данные.
Но если вам нужно проверить более сложный код, который database engine не может обработать, или добавить пользовательские исключения, лучше использовать первый вариант.
Использование CheckConstraint:
При использовании второго варианта оценка выполняется с помощью database engine, который более эффективен, чем python, и также может проверять вставленные данные. В этом случае было бы лучше использовать db engine для проверки, чтобы также проверять вставленные данные и сохранять их ближе к исходному тексту. Если проверка достаточно проста для компонента database engine, используйте метод CheckConstraint.