2011-10-17 45 views
0

我需要在多個表上執行原始的sql。然後我渲染結果集。對於一個表,我會做:django/python:與多個表的原始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

目前尚不清楚你在這裏試圖完成什麼。也許顯示關於你的模型的更多細節以及這個查詢意味着做什麼會有所幫助。 –

+0

我想從多個表中選擇表中的外鍵連接。我不需要幫助編寫實際的查詢。對不起,我不確定爲什麼不明確:( – user984003

+0

它看起來像你需要幫助的查詢。我不知道你爲什麼認爲你需要原始SQL來做到這一點在Django。如果你不需要幫助編寫查詢,然後我對你提問的想法更少了 –

回答

1
  1. 這是有效的。不知道爲什麼它沒有之前:(從丹尼斯·貝克的評論:

你不需要有在它的所有字段的模型,你只需要從第一模型和領域你。確實需要具有唯一名稱的字段,並且據我所知,應該使用「tablename.field as fieldname」來確保您具有所有唯一字段。我已經以這種方式完成了一些相當複雜的查詢將它們綁回到一個模型中 -

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 
+0

使用遊標時,如何將每一行映射到模型?我對Django完全陌生。 django服務器是否緩存模型實例,從本質上覆制數據庫中的數據?當您的API在生產中被擊中時,數據是來自緩存的模型數據,還是每次都執行遊標對象?謝謝! –

0

你不需要一個包含你想從原始sql返回的字段的模型。如果你碰巧有一個模型實際上有你想從原始sql返回的字段,那麼你可以將你的原始sql輸出映射到這個模型,否則你可以使用cursors來完成模型。

+0

這裏的文檔https://docs.djangoproject.com/en/dev/topics/db/sql/說「raw()會自動將查詢中的字段映射到模型上的字段。」這表明我必須有一個至少包含查詢字段的模型。由於查詢從兩個表中生成字段,那麼我必須有第三個包含這些字段的模型,否?這是我希望避免的。 – user984003

+0

我花了一段時間才明白問題:)這是一個非常好的問題,我認爲django在這個領域缺乏很多。我改變了我的答案。 – akonsu

+0

你不需要有一個模型,其中的所有領域,你只需要第一個模型和領域。你確實需要擁有唯一名稱的字段,並且據我所知應該使用「tablename.field as fieldname」來確保你擁有所有獨特的字段。我用這種方式做了一些相當複雜的查詢,並且總是將它們綁定回單一模型。 –