Вы не можете фильтровать на основе @property
.
Насколько я понимаю вашу проблему правильно, вы можете агрегировать сумму связанных AmountGiven
и сумму AmountReturned
, а затем вычислять поле due
, в котором сохраняются результат вычитания буквы и формы.
Запрос:
from django.db.models import Sum, Value
from django.db.models.functions import Coalesce
Contact.objects.filter(
amountgiven__amount__gt=0
).annotate(
due=Sum('amountgiven__amount') - Coalesce(Sum('amountgiven__amountreturned__amount'), Value(0))
).order_by('-due').values_list('due', 'id')
вернет:
<QuerySet [{'id': 3, 'due': 2500.0}, {'id': 1, 'due': 2450.0}, {'id': 2, 'due': 1500.0}]>
Однако с этим решением вы не сможете различить множество AmountGiven
в одном Contact
. Вы получаете большую картину как результаты.
Если вы хотите разделить из-за значения для AmountGiven
экземпляра, просто аннотируйте так:
AmountGiven.objects.annotate(
due=Sum('amount') - Coalesce(Sum('amountreturned__amount'), Value(0))
).order_by('-due').values_list('due', 'contact__id', 'id')
, который возвращает
<QuerySet [
{'contact__id': 3, 'id': 3, 'due': 2500.0},
{'contact__id': 1, 'id': 1, 'due': 1750.0},
{'contact__id': 2, 'id': 2, 'due': 1500.0},
{'contact__id': 1, 'id': 4, 'due': 350.0},
{'contact__id': 1, 'id': 5, 'due': 350.0}
]>
Ссылки
- Coalesce