python - Django / python : raw sql with multiple tables

标签 python sql django

我需要对多个表执行原始 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 表仅引用使用简单的数据模型。

最佳答案

  1. 这行得通。不知道为什么以前没有 :( 来自 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/

相关文章:

python - 带有 gabor 过滤器的 Keras 内核初始化器

python - 字典键数

sql - 在 postgres 中调整子查询

Django - 模型的选择

django - 如何在 Django 中使用 PostgreSQL 的 "text"列类型?

python - 按字符串名称以编程方式查找运算符

python - 如何以线程安全的方式在python中使用全局变量

mysql - 查找每种产品的总命中率和唯一命中率

sql - 带递归 Postgres 查询的约束

Django:Case 有条件