2010-01-09 12 views
11

Tengo un modelo con ManyToManyField con un modelo directo en el que hay un campo booleano sobre el que me gustaría filtrar.Administrador personalizado Django con 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() 

pensé que la variable use_for_related_fields me permitiría filtrar los resultados M2M como en un d despachador de este modo: d.simulations.completed() o d.simulations.queued() pero estos no parecen funcionar como esperaba. ¿Entiendo mal cómo funciona el use_for_related_fields, o estoy haciendo algo mal?

Respuesta

3

A partir de los documentos en Using managers for related object access:

puede forzar a Django que use la misma clase que el gestor por defecto para su modelo mediante el establecimiento de los use_for_related_fields atributo en la clase gerente.

Significado, en su caso, puede forzar d.simulation utilizar el SimulationManager normales (y no DispatcherManager - DispatcherManager será utilizado para la dirección opuesta de la conexión Por ejemplo, Simulation.objects.get(id=1).dispatcher_set.completed.).

Creo que la forma más sencilla de lograr lo que desea es definir un get_completed_simulations y un get_queued_simulations métodos en DispatcherManager. Entonces el uso sería d.get_completed_simulations().

Cuestiones relacionadas