2

我有以下型号:

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对象及其余额(余额是它们的总数和总数之间的差异DebitCredit)。

我想过滤总组名称以及总和总的减法Debit.. CreditDebit并且CreditJournal模型的字段)。

谁能帮我弄清楚上述情况。

我之前尝试Subqueries过,但Django还没有做两步SubqueryDjango

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

谢谢

4

2 回答 2

3

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

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
)
于 2019-07-08T17:47:31.500 回答
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)>]>
于 2019-08-05T16:36:37.387 回答