Django ограничение модели - сумма всех строк для пользователя меньше константы - PullRequest
0 голосов
/ 09 января 2020

Мне нужно добавить ограничение в модель Django, чтобы проверить сумму всех предыдущих значений в модели для определенного пользователя c.


Class Book(models.Model):
    user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    price = models.Decimal(max_digits=6, decimal_places=2)

    class Meta:
        constraints = [
            models.CheckConstraint(check=models.Q(price__lte=1000), name='weight_lte_1000')
        ]

Это ограничение применяется к каждой записи , но мне нужна еще одна проверка, чтобы убедиться, что сумма всех значений цены для книг, связанных с указанным c пользователем, остается ниже 1000.

1 Ответ

2 голосов
/ 09 января 2020

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()), поэтому это «решение» не так хорошо. как то, что вы хотели, но это может быть отправной точкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...