#sql #django #sqlite #orm #django-queryset
Вопрос:
Я попытался реализовать этот SQL-запрос с помощью Django, где возможно несколько платежей по одной и той же комиссии, и я должен получать платежи, которые ниже суммы комиссии.
Мне удалось получить общую сумму платежей по одному и тому же идентификатору комиссии, используя
Fee.objects.get(pk=self.pk).payment_set.aggregate(Sum('amount'))
но не могу найти способ сравнить его с payment_fee.сумма
SQL, который я пытался реализовать:
SELECT
payment_fee.id,
payment_fee.amount ,
SUM(payment_payment.amount)
as `su`
FROM
payment_payment
inner join payment_fee on
fee_id = payment_fee.id
GROUP By
fee_id
HAVING
(su)<payment_fee.amount
модели django:
class Fee(models.Model):
amount = models.DecimalField(max_digits=10, decimal_places=2, default=0)
class Payment(models.Model):
fee = models.ForeignKey(Fee, on_delete=models.CASCADE, related_name='fee_payment')
amount = models.DecimalField(max_digits=10, decimal_places=2, default=0)
Ответ №1:
Должно сработать что-то вроде следующего. Сначала аннотируйте каждый сбор общей суммой всех связанных сумм платежей, затем отфильтруйте сборы, в которых эта аннотация меньше суммы сбора
from djago.db.models import Sum, F
Fee.objects.annotate(
total_payments=Sum('fee_payment__amount')
).filter(
total_payments__lt=F('amount')
)
Комментарии:
1. пришлось немного измениться с @Iain
Fee.objects.annotate(total_paid=Sum('payment__amount')).filter(amount__gt=F('total_paid'))
, и это сработало.