Django原始SQL查询-遍历结果,它为每次迭代执行一个查询

问题描述

编辑:

这里的问题归结为Djangoraw()方法的工作方式。它返回模型实例(具有您正在访问的属性,从而导致额外的查询)。

这里的适当工具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- direct

解决方法

在注意到Django的某些内置查询效率低下之后,一直在编写一些原始SQL查询。我试图遍历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)在循环之前添加,没有效果。

有人可以帮我从这里出去吗?这似乎应该很简单。

谢谢,马特