我需要对多个表执行原始 sql。然后我渲染结果集。对于一张 table ,我会这样做:
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(选择、来源、位置)?当然,我的实际查询比这个例子要复杂。 (我在 models.py 中定义的模型成为数据库中的实际表,因此使用模型/表术语。不知道如何引用它们,抱歉。)我使用原始 sql,因为我发现 python 表仅引用使用简单的数据模型。
最佳答案
- 这行得通。不知道为什么以前没有 :( 来自 Dennis Baker 的评论:
您不需要拥有包含所有字段的模型,您只需要第一个模型和其中的字段。您确实需要具有唯一名称的字段,据我所知您应该使用“tablename.field as fieldname”来确保您拥有所有唯一的字段。我已经用这种方式对 5 个以上的表进行了一些相当复杂的查询,并且总是将它们绑定(bind)回单个模型。 –
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
关于python - Django / python : raw sql with multiple tables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7794816/