用自定义管理器过滤django相关对象

时间:2014-01-11 14:13:33

标签: django

我编写自定义管理器,在模板中使用它来显示侧面板上的相关图片。 我的经理工作不对,我不明白为什么。

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()

我的经理返回side = True的所有ExtPhoto对象。 但我只需要与“onenews”相关。

1 个答案:

答案 0 :(得分: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。这使得您的经理可以使用所有查询集方法。