2016-07-07 8 views
1

Ich habe die folgenden Modelle:Django ORM komplexe Abfrage

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 

Dies ist eine einfache Rechnung-Elemente-Struktur. Ich möchte eine Zahlung auf mehrere Artikel verteilen und die Verteilung der Zahlungen verfolgen können. Die SQL-Abfrage liefert mir eine Liste von Artikeln, die ich bezahlen kann, und den maximalen Betrag, den ich bezahlen kann. Gibt es eine Möglichkeit, die gleiche Abfrage mit reinem ORM anstelle von Raw SQL durchzuführen? Ich versuche, rohes SQL zu vermeiden.

Antwort

2
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') 

Dokumentation:

+0

Fantastisch, kurz und süß, wie ein Zauber funktioniert, danke! –