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

How do I use a ModelManager on a Django ManyToMany through field?

假设我有以下型号:

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。我怎样才能让我的模型经理根据 through 字段上的标志适当地过滤我的 ManyToMany 关系?

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

class Poll(models.Model):

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

此处,polloption_set 按预期过滤掉不活动的选项。但是,这使管理器变得毫无意义,因为您也可以将额外的过滤器放在自定义 属性.