django - How to reduce DB queries? -
models:
class technology(models.model): name = models.charfield(max_length=100, unique=true) slug = models.slugfield(max_length=100, unique=true) class site(models.model): name = models.charfield(max_length=100, unique=true) slug = models.slugfield(max_length=100, unique=true) technology = models.manytomanyfield(technology, blank=true, null=true)
views:
def portfolio(request, page=1): sites_list = site.objects.select_related('technology').only('technology__name', 'name', 'slug',) return render_to_response('portfolio.html', {'sites':sites_list,}, context_instance=requestcontext(request))
template:
{% site in sites %} <div> {{ site.name }}, {% tech in site.technology.all %} {{ tech.name }} {% endfor %} </div> {% endfor %}
but in example each site makes 1 additional query technology list. there way make in 1 query somehow?
what looking efficient way reverse foreign-key lookups. generic approach is:
qs = myrelatedobject.objects.all() obj_dict = dict([(obj.id, obj) obj in qs]) objects = myobject.objects.filter(myrelatedobj__in=qs) relation_dict = {} obj in objects: relation_dict.setdefault(obj.myobject_id, []).append(obj) id, related_items in relation_dict.items(): obj_dict[id].related_items = related_items
i wrote blogpost while ago, can find more info here: http://bit.ly/ge59d2
Comments
Post a Comment