2014-01-11 81 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