Django原始SQL查询 - 循环结果,它为每次迭代执行查询

时间:2011-05-17 21:22:31

标签: sql django

在注意到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),没有效果。

任何人都可以帮助我吗?这似乎应该很简单。

谢谢, 马特

1 个答案:

答案 0 :(得分:4)

编辑:

这个问题在这里分解了Django的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