如何在Django ManyToMany through字段上使用ModelManager?

时间:2016-03-12 17:18:01

标签: django django-models django-managers

假设我有以下型号:

class Poll(model):
     title = models.CharField()

class Option(model):
     title = models.CharField()
     polls = models.ManyToManyField(
         Poll, 
         through='PollOption', 
         null=True, 
         blank=True, 
         related_name='options'
     )

class PollOptionManager(models.Manager):
    use_for_related_fields = True
    def get_queryset(self):
        return super(PollOptionManager, self).get_queryset().filter(
            is_active=True
        )

class PollOption(model):
     poll = ForeignKey(Poll)
     option = ForeignKey(Option)
     is_active = BooleanField(default=True)
     objects = PollOptionManager()

当我尝试查询Poll.options.all()时,我仍然收到Option PollOption.is_activeFalse的{​​{1}}个实例。如何让我的模型管理员根据ManyToMany字段上的标记正确过滤我的through关系?

1 个答案:

答案 0 :(得分:1)

问题是直通模型(相关)管理器从未在您的方案中实际使用过。要使用自定义管理器,您必须明确使用它,例如:

class Poll(models.Model):

    @property
    def active_options(self):
        return Option.objects.filter(id__in=self.polloption_set.values_list('option'))

此处,polloption_set按预期过滤掉非活动选项。然而,这使得经理毫无意义,因为您可以将额外的过滤器放在定制属性中。