2010-01-09 3 views
11

У меня есть модель с ManyToManyField с сквозной моделью, в которой есть булевское поле, на которое я бы хотел отфильтровать.Пользовательский менеджер Django с 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.simulations.completed() или d.simulations.queued(), но они, кажется, не работает, как я ожидал. Я не понимаю, как работает use_for_related_fields, или я делаю что-то неправильно?

ответ

3

Из документов на Using managers for related object access:

вы можете заставить Django использовать один и тот же класс, как менеджер по умолчанию для вашей модели, установив атрибут use_for_related_fields на классе менеджера.

Значение, в вашем случае, вы можете заставить d.simulation использовать нормальный SimulationManager (а не DispatcherManager - DispatcherManager будет использоваться для противоположного направления канала связи, например, Simulation.objects.get(id=1).dispatcher_set.completed.).

Я думаю, что самый простой способ добиться того, что вы хотите, - определить методы get_completed_simulations и get_queued_simulations в DispatcherManager. Таким образом, использование будет d.get_completed_simulations().

Смежные вопросы