# HG changeset patch # User cavaliet # Date 1372932822 -7200 # Node ID 87fd3589b65a8627ad314e1695746e66ce7b1e1b # Parent f0883894f38645bc370824bdf754920d26be4e5b queries optimisation second step diff -r f0883894f386 -r 87fd3589b65a src/egonomy/models.py --- a/src/egonomy/models.py Thu Jul 04 11:31:21 2013 +0200 +++ b/src/egonomy/models.py Thu Jul 04 12:13:42 2013 +0200 @@ -9,6 +9,7 @@ from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic +from egonomy.utils.queries import cache_generics class ImageMetadata(models.Model): @@ -196,6 +197,12 @@ modification = models.DateTimeField(auto_now=True) public = models.BooleanField(null=False, default=True) # Collection is published or not, always published by default publication_type = models.IntegerField(choices=PUBLICATION_CHOICES, default=1) # list, mosaic, slideshow or geographical + + @property + def first_four_items(self): + items = CollectionItem.objects.filter(collection=self).select_related('author', 'content_type', 'object_id', 'content_object').order_by("order")[:4] + cache_generics(items) + return items diff -r f0883894f386 -r 87fd3589b65a src/egonomy/templates/partial/collection_in_list.html --- a/src/egonomy/templates/partial/collection_in_list.html Thu Jul 04 11:31:21 2013 +0200 +++ b/src/egonomy/templates/partial/collection_in_list.html Thu Jul 04 12:13:42 2013 +0200 @@ -10,7 +10,7 @@ -{% with items=col.items.all %} +{% with items=col.first_four_items %}
{% for item in items|slice:":2" %} {% include 'partial/little_square_item_for_collection.html' %} diff -r f0883894f386 -r 87fd3589b65a src/egonomy/utils/queries.py --- a/src/egonomy/utils/queries.py Thu Jul 04 11:31:21 2013 +0200 +++ b/src/egonomy/utils/queries.py Thu Jul 04 12:13:42 2013 +0200 @@ -8,7 +8,6 @@ Adapted for egonomy project by Thibaut Cavalie ''' from django.contrib.contenttypes.models import ContentType -from egonomy.models import Image, Fragment import logging logger = logging.getLogger(__name__) @@ -24,10 +23,12 @@ for ct, fk_list in generics.iteritems(): ct_model = content_types[ct].model_class() # In our case relations[ct] = ct_model.objects.in_bulk(list(fk_list)) - # is not enough because we need select_related for both images and fragments - if content_types[ct] == ContentType.objects.get_for_model(Image): + # is not enough because we need select_related for both images and fragments. + # We test str(content_types[ct])=="fragment" because it avoids import Image and Fragment just to test contenttypes. + # So we can import this function in models.py. + if str(content_types[ct]) == "image": relations[ct] = ct_model.objects.select_related('info', 'metadata').in_bulk(list(fk_list)) - elif content_types[ct] == ContentType.objects.get_for_model(Fragment): + elif str(content_types[ct]) == "fragment": relations[ct] = ct_model.objects.select_related('image', 'image__info', 'image__metadata','author').in_bulk(list(fk_list)) else: relations[ct] = ct_model.objects.in_bulk(list(fk_list))