Django пользовательский менеджер с ManyToManyField

У меня есть модель с 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 работы, или я делаю что-то не так?

11
задан Bryan Ward 9 January 2010 в 00:45
поделиться

1 ответ

[

]Из документации на []Используя менеджеры для доступа к связанным объектам[]:[

] [
] [

]вы можете заставить 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()[].[

].
3
ответ дан 3 December 2019 в 12:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: