Django自定义管理器与ManyToManyField

15

我有一个模型,其中包含一个带有through模型的ManyToManyField,该模型中有一个布尔字段,我想对其进行过滤。

from simulations.models import *
class DispatcherManager(models.Manager):
    use_for_related_fields = True

    def completed(self):
        original = super(DispatcherManager,self).get_query_set()
        return original.filter(dispatchedsimulation__status=True)
    def queued(self):
        original = super(DispatcherManager,self).get_query_set()
        return original.filter(dispatchedsimulation__status=False)

class Dispatcher(models.Model):
    name = models.CharField(max_length=64)
    simulations = models.ManyToManyField('simulations.Simulation',
            through='DispatchedSimulation')
    objects = DispatcherManager()

class DispatchedSimulation(models.Model):

    dispatcher = models.ForeignKey('Dispatcher')
    simulation = models.ForeignKey('simulations.Simulation')
    status = models.BooleanField()

我曾认为use_for_related_fields变量可以让我像在分派器d中那样过滤m2m结果,例如:d.simulations.completed()d.simulations.queued(),但这些似乎不像我预期的那样工作。我是否对use_for_related_fields的工作原理有误解,还是我做错了什么?

1个回答

3
使用管理器访问相关对象的文档中可以看到:

你可以通过设置管理器类上的use_for_related_fields属性,强制Django使用与模型的默认管理器相同的类

这意味着,在您的情况下,您可以强制d.simulation使用普通的SimulationManager(而不是DispatcherManager - DispatcherManager将用于链接的相反方向。例如:Simulation.objects.get(id=1).dispatcher_set.completed)。
我认为实现您想要的最简单的方法是在DispatcherManager中定义一个get_completed_simulationsget_queued_simulations方法。因此,使用将是d.get_completed_simulations()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接