2017-10-17 184 views
1

在Django應用程序,我有三個型號:Django的:獲得相關對象的相關對象,並傳遞給模板

class A(models.Model): 
    aId = models.AutoField(primary_key=True) 

class B(models.Model): 
    bId = models.AutoField(primary_key=True) 
    aId = models.ForeignKey(A) 

class C(models.Model): 
    cId = models.AutoField(primary_key=True) 
    bId = models.ForeignKey(B) 

還有就是A和B之間的一對多的關係,因爲有B之間和C. 還有一個視圖類與context_data。在模板中,我需要顯示和過濾Bs,以及它們的Cs。 如何將所有與A相關的B和與這些B相關的所有Cs傳遞給我的模板(上下文)? 我試圖在兩個數組中分別獲得Bs和Cs,但它似乎並不是一個好主意,因爲我無法通過Bs對Cs進行分類。

回答

1

假設您有一個名爲a的實例A

bs = a.b_set.all() 
for b in bs: 
    cs = b.c_set.all() 

爲了避免多個查詢,您可以prefetch related objects

1

所以這將是你的觀點的代碼。我不確定args/kwargs中給出了哪個對象。

from django.views.generic import TemplateView 

class YourView(TemplateView): 
    template_name = 'yourtemplate.html' 

    def get_context_data(self, **kwargs): 
     a = kwargs.get('a') 
     b = kwargs.get('b') 
     ctx = super().get_context_data(**kwargs) 

     ctx['all b related to a'] = a.b_set.all() 
     ctx['all c related to b'] = b.c_set.all() 
     return ctx 

如果你要查詢集結合起來,說每個CS的多個查詢集B中@s_puria建議,你可以使用UNION操作https://docs.djangoproject.com/en/1.11/ref/models/querysets/#union