python - Django queryset efficiency -


i have item object has foreignkey receipt object.

class receipt(models.model):     ...  class item(models.model):     receipt = models.foreignkey(receipt)     name = models.charfield(max_length=255)     cost = models.decimalfield(default=0, max_digits=6, decimal_places=3)      ... 

i display receipts using generic view.

class receiptview(detailview):     model = receipt 

and on template, want show items on receipt.

<ul> {% item in object.item_set.all %}     <li>{{ item.name }}</li> {% endfor %} </ul> 

this works fine smaller data sets. 1 of receipt objects has 1600 items related it. loading page receipt incredibly slow. using django debug toolbar notice django executing 1 query per item.

if alter list item in template rather displaying property of item, display item itself, django executes single query.

<ul> {% item in object.item_set.all %}     <li>{{ item }}</li> {% endfor %} </ul> 

unfortunately need display 10 of item's properties in template. there someway can tell django execute single query items , of properties?

use prefetch_related. since doing reverse foreign key lookup, you're working manytomany relationship. prefetch_related separate query under hood, retrieve , cache of receipt objects you.

since you're using generic views, rather specifying model, can specify queryset.

class receiptview(detailview):     queryset = receipt.objects.prefetch_related('related_items') 

in order this, you'll have specify related_name in item model:

class item(models.model):     receipt = models.foreignkey(receipt, related_name='related_items') 

Comments

Popular posts from this blog

c++ - QTextObjectInterface with Qml TextEdit (QQuickTextEdit) -

javascript - angular ng-required radio button not toggling required off in firefox 33, OK in chrome -

xcode - Swift Playground - Files are not readable -