2014-01-11 110 views
0

我編寫自定義管理器以便在模板中使用它以在側面板上顯示相關圖片。 我的經理工作錯了,我不明白爲什麼。django相關對象使用cusom管理器進行過濾

class RelatedPicsManager(models.Manager): 
    use_for_related_fields = True 

    def sidepics(self): 
     return super(RelatedPicsManager, self).get_queryset().filter(side = True) 

class News (models.Model): 
    ... 
    pass 

class ExtPhoto(models.Model): 
    news = models.ForeignKey(News, related_name = 'extphotos') 
    side = models.BooleanField(...) 
    ... 
    objects = RelatedPicsManager() 

當我得到的消息,並嘗試一下它的所有側面圖片

>>> onnews.extphotos.sidepics() 

我的經理返回所有ExtPhoto與側對象=真。 但我只需要與「onenews」相關。

+0

你不能那樣做。上下文在你的經理中丟失了。您最好使用onenews.objects.side_extphotos()來代替。 – gawel

回答

0

我想你可以通過使用自定義QuerySet解決這個問題:

class ExtPhotoQuerySet(models.query.QuerySet): 
    def sidepics(self): 
     return self.filter(side=True) 

class ExtPhotoManager(models.Manager): 
    use_for_related_fields = True 

    def get_queryset(self): 
     return ExtPhotoQuerySet(self.model) 

class ExtPhoto(models.Model): 
    objects = ExtPhotoManager() 

這樣,onnews.extphotos.sidepics()僅過濾與onnews照片。如果您還想使用ExtPhoto.objects.sidepics(),我建議從django-model-utils繼承PassThroughManager。這使得您的經理可以使用所有的queryset方法。

+0

謝謝!它適用於一些小問題。 'onnews.extphotos.sidepics()'拋出錯誤''RelatedManager'對象沒有'sidepics'屬性,因爲我們在查詢集中添加了方法,而不是在管理器中。這就是爲什麼我需要調用'onnews.extphotos.all()。sidepics()',並不像調用管理器本身那麼優雅。但這總比沒有好。 – user3162872

+0

啊,對,'extphotos'也是一名經理。使用'PassThroughManager'應該可以避免這種煩惱,因爲它會讓你的經理使用'.sidepics()'。請參閱http://django-model-utils.readthedocs.org/en/latest/managers.html#passthroughmanager – sk1p