AFAIK, вы не можете сделать это только с CheckConstraints
, но я думаю, что вы можете заключить метод вашей модели save()
в транзакцию и выполнить проверку самостоятельно там. Если проверка не пройдена, просто вызовите исключение
class Book(models.Model):
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
name = models.CharField(max_length=50)
price = models.DecimalField(max_digits=6, decimal_places=2)
@transaction.atomic
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
price_sum = Book.objects.filter(user=self.user).aggregate(price_sum=Sum('price'))['price_sum'] # You probably need some more code to handle corner cases
if price_sum > 1000:
raise PriceException() # Made up exception. This will provoke a rollback
. Теперь обратите внимание, что в некоторых ситуациях пользовательские методы save()
не используются (особенно при миграции и .update()
), поэтому это «решение» не так хорошо. как то, что вы хотели, но это может быть отправной точкой.