在Django中,我可以为反向ManyToMany关系创建一个额外的自定义管理器吗?

时间:2016-05-02 15:45:23

标签: django django-models

我想创建一个额外的管理器来获取反向ManyToMany关系的过滤版本。我有这些模型:

class Photo(models.Model):
    # ...
    is_public = models.BooleanField()

    albums = models.ManyToManyField('Album')

class Album(models.Model):
    # ...

我可以使用album.photo_set.all()获取相册中的所有照片。我想提供一种方法,通过album.photo_set.public()(在某处,.filter(is_public=True))来获取相册中的公开照片。

我想我想提供一个额外的Related manager,但我不确定是否可能。我不想或不需要替换默认的相关管理器(无论如何这听起来都是个坏主意)。我不需要关系的自定义直通模型,除非这是实现这一目标的唯一方法。

2 个答案:

答案 0 :(得分:2)

当然,你可以成为一名相关经理,但这似乎有点矫枉过正。

为什么不直接在模型中添加一个只返回相册中公开照片的功能?

def get_public(self):

     return self.photo_set.filter(is_public = True)

答案 1 :(得分:0)

您可以像这样创建经理:

class PublicManager(models.Manager):
    use_for_related_fields = True

    def public(self, *args, **kwargs):
        kwargs.update({
            'is_public': True
        })
        return self.get_queryset().filter(*args, **kwargs)