2011-09-23 63 views
1

我有,我想在同一视图中拔出子数据(相关的)一个基本的数据库:Django的子查询

models.py:

class InvoiceHeader(models.Model): 
    customer = models.CharField(max_length = 255) 
    number = models.IntegerField(unique = True) 

class InvoiceLine(models.Model): 
    description = models.CharField(max_length = 255) 
    price = models.DecimalField(max_digits = 10, decimal_places = 2) 
    invoiceheader = models.ForeignKey(InvoiceHeader) 

views.py:

def list_invoices(request): 
    invoices = InvoiceHeader.objects.all() 

我想要得到的是list_invoices视图中的发票总计,它包含每个invoiceheader的invoicelines.price(总计),以便在模板中我可以放上:

{% for invoice in invoices %} 
    {{ invoice.subtotal }} 
{% endfor %} 

我认为这是与某些东西在models.py文件中做的事情,但我迷失了与此。

所以任何帮助将不胜感激。

回答

1

你想用aggregation

from django.db.models import Sum 

def list_invoices(request): 
    invoices = Item.objects.all().annotate(subtotal=Sum('invoiceline__price')) 
+0

感谢它的工作原理治疗。 我可以在熔炉中再添加一个问题: 如果我在invoiceline类中有另一个名为qty的字段,那么我可以使用相同的方法执行多次计算,如小计= SUM(数量*价格)? – ausi1972

+0

不幸的不是。你需要用SQL来做,也许用'extra'方法。 –

+0

我记得关于在models.py文件中放置一个def语句之前,它允许您定义一个可调用像get_invoice_total(request):subtotal = self.invoiceline.price * self.invoiceline.qty返回小计 – ausi1972