После ForgeinKeys в Django select_related для заполнения переменной * _set? - PullRequest
1 голос
/ 11 августа 2011

У меня есть несколько простых моделей Django, таких как:

class Event(models.Model):
    # some stuff

class Price(models.Model):
    event = models.ForgeinKey(Event)

т.е. каждый Event имеет 1 или более Price.

Я выбираю некоторые события, подобные этому: events = Event.objects.filter(…), а затем зацикливаю их for event in events:, внутри цикла мне нужно получить доступ ко всем Price объектам для каждого события (то есть с event.price_set), однако делает новый запрос SQL для каждого события. У меня тысячи событий, и это вызывает тысячи запросов. Есть ли способ, которым я могу заранее заполнить price_set для каждого события за один раз?

Я попытался добавить select_related в QuerySet, но он не работает (я все еще вижу все запросы на панели инструментов отладки Django). Конечно, есть какой-нибудь способ сделать соединение исходного SQL-запроса, который объединит все Event и их Prices в одном запросе?

Ответы [ 2 ]

2 голосов
/ 11 августа 2011

Посмотрите на: https://github.com/lilspikey/django-batch-select/ Это позволит вам получить то, что вы хотите, всего за 2 запроса (1 для событий и 1 для цен)

1 голос
/ 12 января 2012

Как подсказка другим людям с этой проблемой:

Django 1.4 (еще не выпущенный на момент написания), имеет prefetch_related в качестве дополнения к select_related, что делает именно то, что я здесь прошу.

...