2017-04-10 63 views
0
class ModelA(Model): 
    pass 

class ModelB(Model): 
    modela = ForeignKey(ModelA, on_delete=CASCADE) 

class ModelC(Model): 
    modelb = ForeignKey(ModelB, on_delete_CASCADE) 

在這種情況下,Django會自動爲我們創建一些額外的管理器。例如,如果maModelA的實例,那麼我們可以編寫:ma.modelb_set.all(),並且如果mbModelB的實例,那麼我們可以編寫:mb.modelc_set.all()如何在Django中創建一個自定義的相關管理器?

能夠引用與ModelA相關的所有ModelC實例會很方便。當然,如果maModelA的一個實例,我們總是可以寫出:ModelC.objects.filter(modelb__modela=ma).distinct()。然而,它會更方便,如果我們可以定義爲ModelA經理,使我們通過簡單地寫,執行上面的查詢:ma.modelc_set.all()

如何寫這樣的經理ModelA

回答

2

這不是經理的工作,而只是一種正常的模型方法。既然您正在查找與ModelA的特定實例相關的項目,則可以在該模型上創建一個方法。如果你真的想要,你可以把它叫做modelc_set並使之成爲一個屬性:

@property 
def modelc_set(self): 
    return ModelC.objects.filter(modelb__modela=self).distinct() 
+0

好的,謝謝你的回答。然而,在這種情況下,爲什麼Django的默認管理器用於反轉一對多關係管理器而不是屬性? – gaazkam

+1

你不能用屬性做的一件事:'prefetch_related('modelc_set')' – gaazkam

相關問題