django / python:包含多个表的原始sql

时间:2011-10-17 13:54:31

标签: python sql django

我需要在多个表上执行原始sql。然后我渲染结果集。我会做一张桌子:

sql = "select * from my_table"
results = my_table.objects.raw(sql)

对于我正在做的多个表:

sql = "select * from my_table, my_other_table where ...."
results = big_model.objects.raw(sql)

但是,我真的需要创建一个表/模型/类big_model,它包含我可能需要的所有字段吗?我永远不会在这个“表”中存储任何数据。

增加:

我有一张表my_users。我有一个表my_listings。这些在Models.py中定义。表my_listings具有my_users的外键,指示谁创建了列表。

SQL是

"select user_name, listing_text from my_listings, my_users where my_users.id = my_listings.my_user_id". 

我希望这个SQL生成一个结果集,我可以用它在django中呈现我的页面。

问题是:我是否必须创建包含字段user_name和listing_text的模型?或者还有一些更好的方法仍然使用原始SQL(select,from,where)?当然,我的实际查询比这个例子更复杂。 (我在models.py中定义的模型成为数据库中的实际表,因此使用了模型/表术语。不确定如何引用它们,抱歉。)我使用原始sql因为我发现python表只引用使用简单的数据模型。

2 个答案:

答案 0 :(得分:2)

  1. 这个有效。不知道为什么之前没有:(来自Dennis Baker的评论:
  2. 您不需要拥有包含其中所有字段的模型,您只需要第一个模型和字段。您确实需要具有唯一名称的字段,据我所知,您应该使用“tablename.field as fieldname”来确保您拥有所有唯一字段。我用这种方式用5+表做了一些相当复杂的查询,并且总是将它们绑定回单个模型。 -

    2。另一种解决方案是使用游标。但是,必须将游标从元组列表更改为字典列表。我确信使用迭代器有更简洁的方法,但这个功能有效。它需要一个字符串,它是原始的sql查询,并返回一个可以在模板中呈现和使用的列表。

    from django.db import connection, transaction
    
    def sql_select(sql):
        cursor = connection.cursor()
        cursor.execute(sql)
        results = cursor.fetchall()
        list = []
        i = 0
        for row in results:
            dict = {} 
            field = 0
            while True:
               try:
                    dict[cursor.description[field][0]] = str(results[i][field])
                    field = field +1
                except IndexError as e:
                    break
            i = i + 1
            list.append(dict) 
        return list  
    

答案 1 :(得分:0)

您不需要包含要从原始sql返回的字段的模型。如果碰巧有一个模型实际上有你想从原始sql返回的字段,那么你可以将你的原始sql输出映射到这个模型,否则你可以使用cursors完全绕过模型。