【问题标题】:Django ORM complex queryDjango ORM 复杂查询
【发布时间】:2016-07-07 02:43:12
【问题描述】:

我有以下型号:

class Invoice(models.Model):
    amount = models.DecimalField()
    date = models.DateTimeField()


class InvoiceItem(models.Model):
    invoice = models.ForeignKey(Invoice)
    description = models.CharField(max_length=256)
    amount = models.DecimalField()

class PaymentDistribution(models.Model):
    item = models.ForeignKey(invoiceItem)
    amount = models.DecimalField()



select a.id,
a.amount,
a.amount-coalesce(sum(b.amount),0) as to_pay
from invoiceitems as a
left join paymentdistribution as b
on (a.id=b.invoiceitem_id)
group by a.id, a.amount
order by to_pay desc

这是一个简单的发票项目结构。我希望能够在多个项目之间分配付款并跟踪付款的分配。 SQL 查询为我提供了我可以支付的项目列表以及我可以支付的最大金额。有没有办法使用纯 ORM 而不是原始 SQL 来执行相同的查询?我试图避免使用原始 SQL。

【问题讨论】:

    标签: django django-orm


    【解决方案1】:
    from django.db.models import F, Sum, Value as V
    from django.db.models.functions import Coalesce
    
    InvoiceItem.objects.values('id', 'amount').annotate(
        to_pay=F('amount') - Coalesce(Sum('paymentdistribution__amount'), V(0))
    ).order_by('-to_pay')
    

    文档:

    【讨论】:

    • 很棒,又短又甜,就像一个魅力,谢谢!
    猜你喜欢
    • 2013-06-09
    • 2021-05-27
    • 2012-08-03
    • 1970-01-01
    • 2021-09-07
    • 2020-01-03
    • 2015-12-06
    • 2011-06-08
    • 2012-10-25
    相关资源
    最近更新 更多