问题描述
编辑:
这里的问题归结为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)
在循环之前添加,没有效果。
有人可以帮我从这里出去吗?这似乎应该很简单。
谢谢,马特