如何解决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)
在循环之前添加,没有效果。
有人可以帮我从这里出去吗?这似乎应该很简单。
谢谢,马特
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。