【问题标题】:How to perform a double step Subqueries in Django?如何在 Django 中执行双步子查询?
【发布时间】:2019-11-18 04:52:17
【问题描述】:

我有以下型号:

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的减法..(DebitCreditJournal模型的字段) .

谁能帮我弄清楚以上问题。

我之前在Django 中尝试过Subqueries,但还没有在Django 中完成两步Subquery

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

谢谢

【问题讨论】:

  • 请添加示例数据和所需的输出。

标签: django django-subquery


【解决方案1】:

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

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
)

【讨论】:

【解决方案2】:

试试这个

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)>]>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2021-06-14
    • 2019-06-08
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    相关资源
    最近更新 更多