Как уменьшить количество запросов к БД? - PullRequest
1 голос
/ 27 февраля 2011

Модели:

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)

Просмотры:

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))

Шаблон:

{% for site in sites %}
<div>
    {{ site.name }},
    {% for tech in site.technology.all %}
        {{ tech.name }}
    {% endfor %}
</div>
{% endfor %}

Но в этом примере каждый сайт делает 1 дополнительный запрос, чтобы получить список технологий,Есть ли способ как-то сделать это в 1 запросе?

Ответы [ 2 ]

1 голос
/ 28 февраля 2011

То, что вы ищете, - это эффективный способ обратного поиска по внешнему ключу.Общий подход:

qs = MyRelatedObject.objects.all()
obj_dict = dict([(obj.id, obj) for obj in qs])
objects = MyObject.objects.filter(myrelatedobj__in=qs)
relation_dict = {}
for obj in objects:
    relation_dict.setdefault(obj.myobject_id, []).append(obj)
for id, related_items in relation_dict.items():
    obj_dict[id].related_items = related_items

Я недавно написал об этом пост в блоге, вы можете найти больше информации здесь: http://bit.ly/ge59D2

0 голосов
/ 27 февраля 2011

Как насчет:

Использование фреймворка Django ;список загрузки request.session['lstTechnology'] = listOfTechnology при запуске.И использовать сессию в остальной части приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...