2010-01-25 47 views
1
class SupercalifragilisticexpialidociousManager(models.Manager): 
    # Sorry, I'm sick of Foo and Spam for now. 
    def get_query_set(self, account=None): 
     return super(SupercalifragilisticexpialidociousManager, 
        self).get_query_set().filter(uncle=model_thats_using_this_manager_instance.uncle) 

我在找的魔法是「叔叔= model_thats_using_this_manager_instance.uncle」。似乎我應該能夠以某種方式做到這一點。我知道我可以說self.model來獲得模型,但如何獲得實例?Django:你如何從管理者內部訪問模型的實例?

回答

5

當您使用管理器時請求實例是沒有意義的。管理者是類級別的屬性 - 如果你嘗試做foo.objects.all()其中foo是Supercalifragilisticexpialidocious的一個實例,你將明確得到一個錯誤:

AttributeError: Manager isn't accessible via Supercalifragilisticexpialidocious instances 
+0

感謝丹尼爾。你的例子幫助我理解管理者存在的背景。我仍然需要找到一種更好地處理這種情況的方法,而不必編寫特殊代碼。 – orokusaki 2010-01-26 00:07:20

3

據我所知,你不能從一個經理內部訪問模型。管理者在整個桌子上操作都沒有意義。

你應該做這樣的事情在模型:

class Model(models.Model): 
    # some attributes here 
    def getAllRelativesWithSameUncle(self): 
     return Model.objects.filter(uncle = self.uncle) 

或經理:

class SupercalifragilisticexpialidociousManager(models.Manager): 
    def getSelfRelativesFor(self, model): 
     return self.get_queryset().filter(uncle=model) 
+1

模型方法更有意義 – 2010-01-25 22:57:09

+0

我認爲你的意思是說,叔叔= model_instance和(self,model_instance),而不是使用模型本身作爲過濾屬性。 – orokusaki 2010-01-26 00:05:50

+0

當然,這就是爲什麼它是用小寫字母寫的;)(我承認它可能會被誤解)。改變了.... – 2010-01-26 00:10:32

相關問題