微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 举报,一经查实,本站将立刻删除。