我需要在多个表上执行原始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表只引用使用简单的数据模型。
答案 0 :(得分: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完全绕过模型。