Что лучше: использовать Django Constraints или вызывать ошибку ValueError в методе сохранения?

Я сталкивался с двумя способами принудительного выполнения условия в моделях Django:

  1. Использование метода 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)
    
  2. Использование ограничений 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.

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