У меня есть модель с 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
переменная позволила бы мне фильтровать результаты m2m как на диспетчере d как так: d.simulations.completed()
или d.simulations.queued()
но они, кажется, не работают, как я ожидал. Я неправильно понимаю как use_for_related_fields
работы, или я делаю что-то не так?
]Из документации на []Используя менеджеры для доступа к связанным объектам[]:[
] [] [] []вы можете заставить Django использовать тот же класс, что и []менеджер по умолчанию для вашей модели[], установив атрибут use_for_related_fields в классе менеджера. [
] [
]Это означает, что в вашем случае вы можете заставить []d.simulation[
] использовать обычный диспетчер SimulationManager (а не диспетчерManager - диспетчерManager будет использоваться для противоположного направления связи. Например, []Simulation.objects.get(id=1).dispatcher_set.completed[
]).[
]Я думаю, что самый простой способ достичь желаемого - это определить в диспетчер-менеджере []get_completeted_simulations[
] и в диспетчер-менеджере []get_queued_simulations[
] методы. Таким образом, использование было бы []d.get_completed_simulations()[
].[