2014-02-27 69 views
1

我有與濾鏡操作的Django的select_related功能的使用問題,這是我的問題,我有三大類:濾波器select_related Django上

class A: 
    # various fields here 

class B(models.model): 
    related_A = models.ForeignKey(A) 
    related_C = models.ForeignKey(C) 
    attribute1 = models.CharField(..) 
    # Other attributes 

class C(models.model): 
    # Attributes 

我想要做的是,通過根據另一參數ATTRIBUTE1(從類B)上的鍵related_C B類上過濾得到類A。 要正確地說明它,我有一個函數get_class_A(個體經營)在我的C類

get_class_A(self,param): 
    classes_B = B.objects.filter(related_C = self,attribute1 = param) 

它返回類B的一個QuerySet我想要做的就是跟隨ForeignKey的指向爲了什麼改造B的這個查詢集爲對象A的列表

我嘗試過各種東西,如:

classes_A = B.objects.select_related('A').filter(related_C = self, attribute1 = param) 

有些變化,但毫無效果。有誰知道如何做到這一點?

感謝

回答

3
def get_class_A(self, param): 
    return A.objects.filter(b__related_c=self, b__attribute1=param).distinct() 

你所描述什麼看起來很像A和C之間的多對多關係,如果你聲明它是這樣,並通過指定B,爲through模型,Django的包括你的額外attributes將爲您創建A和C之間的關係。

此外,select_related()無關與濾波結果,它只是一個工具,它可以讓你減少數據庫查詢的次數。從docs

這是一個性能增強器,它會導致一個更復雜的查詢,但意味着以後使用的外鍵關係不需要數據庫查詢。

+0

就是這樣,我試圖創建一個ManyToMany關係,但有額外的參數。我不知道你可以通過模型添加一些額外的屬性。我會嘗試一下,我認爲這會更容易。 謝謝! – Kobz

+0

@Kobz:當你聲明一個從'B'到'A'的外鍵時,Django可以讓你查詢反向關係(從'A'到'B')。查看關於[跨越關係的查找]的文檔(https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships)。我強烈建議您徹底重新閱讀文檔和教程,否則您可能會遇到很多困惑。 –

+0

我會那樣做的。我開始使用Django的方式沒有完全「未優化」(添加不必要的查詢),現在我試圖儘可能使用Django功能做一些乾淨的代碼,並且有一些概念我不掌握然而。感謝您的幫助,您對我非常有幫助:) – Kobz