Необработанный SQL-запрос Django - зацикливание на результате, он выполняет запрос для каждой итерации - PullRequest
3 голосов
/ 18 мая 2011

Пишу несколько необработанных SQL-запросов, заметив, насколько неэффективны некоторые встроенные запросы Django. Я пытаюсь просмотреть результаты QuerySet и сгруппировать их по категориям (мне известен тег шаблона regroup, у меня это не работает - мне нужно иметь возможность доступа к отдельным группам независимо) , Вот мой код:

m = Media.objects.raw('SELECT * FROM table') # query simplified for sake of example

media_items = {'aim-icons' : [], 'banners' : [], 'hi-res-photos' : [], 'photos' : [], 'print-ads' : [], 'videos' : [], 'wallpapers' : [] }

for item in m:
    media_items[item.type_slug].append(item)

Это дает мне то, что я хочу (например, список, к которому я могу получить доступ, например media_items['wallpapers']), но он выполняет запрос к базе данных для каждой итерации, чтобы получить поле type_slug. Я попытался добавить m = list(m) перед циклом, без эффекта.

Может кто-нибудь помочь мне здесь? Кажется, это должно быть просто.

Спасибо, Matt

1 Ответ

4 голосов
/ 18 мая 2011

Редактировать:

Здесь проблема не в том, как работает метод Джанго raw().Он возвращает экземпляры модели (у которых были свойства, к которым вы обращались, что приводило к дополнительному запросу).

Надлежащие инструменты здесь connection.cursor(), cursor.execute() и cursor.fetchall().Вот пример из документов:

def my_custom_sql():
    from django.db import connection, transaction
    cursor = connection.cursor()

    # Data modifying operation - commit required
    cursor.execute("UPDATE bar SET foo = 1 WHERE baz = %s", [self.baz])
    transaction.commit_unless_managed()

    # Data retrieval operation - no commit required
    cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
    row = cursor.fetchone()

    return row

http://docs.djangoproject.com/en/dev/topics/db/sql/#executing-custom-sql-directly

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