Как выполнить двойной шаг подзапроса в 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)>]>
Другие вопросы по тегам