2013-03-25 97 views
0

那麼,有一個複雜的查詢。 假設我們有3張桌子。django查詢select_related span span關係

class Logs: 
    user = ForeignKey(User) 
    ... 

class User: 
    name = CharField() 
    ... 

class User_Info: 
    user = ForeignKey(User) 
    address = CharField() 
    ... 

我想要做的是通過用戶關聯表日誌和User_Info。 基本上,我想做一個連接,以獲得一個新的表格,它將包含來自User_Info的日誌,用戶和地址的所有字段。我知道select_related。但它只能結合日誌和用戶。

如何獲取User_Info?我想盡量減少數據庫調用。所以理想的答案應該是一個數據庫命中。編輯: 我很欣賞下面的回答。我只想爲這個問題提供我的最終解決方案。

如果確實有一些複雜的查詢,只需使用objects.raw()。它將解決你的大部分問題。

回答

1

models.py

class User: 
    name = CharField() 

    def logs(self): 
     return Logs.objects.filter(user=self) 

    def info(self): 
     return User_Info.objects.filter(user=self) 

views.py

users = User.objects.filter()   

模板

{% for user in users %} 
    {{ name }} 

    {% for log in user.logs %} 
     //log fields 
    {% endfor %} 

    {% for info in user.info %} 
     //info fields 
    {% endfor %} 
{% endfor %} 
+0

這聽起來像是我的問題的一個很好的解決方案!謝謝@凱瑟琳! – 2013-03-26 13:45:42

+0

歡迎........ – catherine 2013-03-26 13:51:42

0

首先,數據庫調用的次數並不一定與代碼行數有關 - Queryset API中的很多方法都是懶惰的。

看起來你實際上在UserUser_Info之間有一對一的關係。在這種情況下,您可以使用OneToOneField而不是ForeignKey。然後,您可以直接從User模型訪問您的信息。見 https://docs.djangoproject.com/en/dev/topics/db/examples/one_to_one/

+0

感謝您的答案!但我沒有權利修改模型......所以也許我必須找到其他的東西。現在,我可以用2個數據庫命中完成我的任務。我想減少到1擊。所以你是對的,我正在尋找一個命中的答案,而不是一個回答。 – 2013-03-25 20:08:24