如何通过字段在 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_active
是 False
。我怎样才能让我的模型经理根据 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
按预期过滤掉不活动的选项。但是,这使管理器变得毫无意义,因为您也可以将额外的过滤器放在自定义 属性.
中
假设我有以下型号:
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_active
是 False
。我怎样才能让我的模型经理根据 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
按预期过滤掉不活动的选项。但是,这使管理器变得毫无意义,因为您也可以将额外的过滤器放在自定义 属性.