Hi all,

Would appreciate some help on how to optimise the following piece of code.

I have two models, "invoice" and "invoice item". The invoice total is 
calculated in invoice_total() by aggregation the sub_total and tax_total 
from all invoice_items (see code below).

The problem I have is that even though I prefetch all the invoice_items in 
the view, when invoice.invoice_total is called in a template 3 identical 
queries will be run for each invoice. For example see some output from a 
profile.

# All invoice items are prefetched correctly
SELECT ••• FROM `billing_invoice_item` WHERE 
`billing_invoice_item`.`invoice_id` IN (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 
13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 
32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 51, 
53, 54, 55, 56, 58, 59, 60, 61, 62, 65, 66, 67, 68, 69, 70, 72, 73, 74, 75, 
76, 77, 78, 80, 81, 82, 84, 85, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97, 98, 
99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 113, 114, 115, 
116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 129, 130, 131, 
132, 134, 135, 136, 137, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 
149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 
164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 
179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 
194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 
209, 210, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 
225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 
240, 241, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 
256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 
271, 272, 273, 274, 275, 276, 277)

but then after this the table is queried 3 more times
SELECT ••• FROM `billing_invoice_item` WHERE 
`billing_invoice_item`.`invoice_id` = 277
SELECT ••• FROM `billing_invoice_item` WHERE 
`billing_invoice_item`.`invoice_id` = 277
SELECT ••• FROM `billing_invoice_item` WHERE 
`billing_invoice_item`.`invoice_id` = 277

I'm using django 1.5 and my code is below.

Any thoughts?

#models.py
class Invoice(models.Model):

    customer =  models.ForeignKey(Customer)
    :
    :
    :

    def invoice_total(self):  
        invoice_total = self.invoice_item_set.aggregate(Sum('sub_total'), 
Sum('tax_total'))
        return str(round(invoice_total['sub_total__sum'], 2))

class Invoice_Item(models.Model):
    invoice =  models.ForeignKey('Invoice')
    sub_total = models.DecimalField(blank=True, null=True, max_digits=9, 
decimal_places=2)
    tax_total = models.DecimalField(blank=True, null=True, max_digits=9, 
decimal_places=2)
    :
    :
    :

#views.py
def invoice(request):
    
    invoices = Invoice.objects.all().prefetch_related('invoice_item_set', 
'journals', 'journals__transaction_set', 
'journals__transaction_set__account',  'customer')

    return render_to_response('billing/invoices.html', {'invoices': 
invoices,}, context_instance=RequestContext(request))

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to