Как выполнить двойной шаг подзапроса в Django?
У меня есть следующие модели:
class Group(models.Model):
group_name = models.CharField(max_length=32)
class Ledger(models.Model):
ledger_name = models.CharField(max_length=32)
group_name = models.ForeignKey(Group,on_delete=models.CASCADE,null=True,related_name='ledgergroups')
class Journal(models.Model):
By = models.ForeignKey(Ledger,on_delete=models.CASCADE,related_name='Debitledgers')
To = models.ForeignKey(Ledger,on_delete=models.CASCADE,related_name='Creditledgers')
Debit = models.DecimalField(max_digits=20,decimal_places=2,default=0)
Credit = models.DecimalField(max_digits=20,decimal_places=2,default=0)
Как вы можете видеть Journal
Модель связана с Ledger
модели с Foreignkey
отношение, которое дополнительно связано с Group
модель.
Мой сценарий довольно сложный.
Я хочу отфильтровать Group
объекты и их балансы (Балансы - это разница между их Debit
и их общее Credit
).
Я хочу отфильтровать общие имена групп и вычитать из общего Debit
и всего Credit
..(Debit
а также Credit
поля Journal
модель).
Может ли кто-нибудь помочь мне разобраться в вышесказанном.
я пытался Subqueries
прежде чем в Django
но не сделал два шага Subquery
в Django
,
Любое решение будет полезно.
Спасибо
2 ответа
Вы можете использовать аннотации для расчета сумм, средних значений, подсчетов и т. Д. Эти аннотации затем можно использовать для фильтрации
from django.db.models import Sum, F
groups_with_negative_balance = Group.objects.annotate(
total_debt=Sum('ledgergroups__Debitledgers__Debit'),
total_credit=Sum('ledgergroups__Creditledgers__Credit'),
).annotate(
balance=F('total_credit') - F('total_debt')
).filter(
balance__lt=0
)
Попробуй это
from django.db.models import Subquery
>>> users = User.objects.all()
>>> UserParent.objects.filter(user_id__in=Subquery(users.values('id')))
<QuerySet [<UserParent: UserParent object (2)>, <UserParent: UserParent object (5)>, <UserParent: UserParent object (8)>]>