如何在Django中执行双重步骤子查询?

时间:2019-07-08 16:15:45

标签: django django-subquery

我有以下型号:

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的减法。( DebitCredit是{的字段{1}}模型)。

任何人都可以帮助我解决以上问题。

我之前在Journal中尝试过Subqueries,但是在Django中没有做两步Subquery

任何解决方案都会有所帮助。

谢谢

2 个答案:

答案 0 :(得分:0)

您可以使用注释来计算总和,平均值,计数等。然后可以使用这些注释进行过滤

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
)

答案 1 :(得分: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)>]>