2010-01-09 4 views
11

J'ai un modèle avec un ManyToManyField avec un modèle traversant dans lequel il y a un champ booléen sur lequel j'aimerais filtrer.Django custom manager avec 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() 

Je pensais que la variable use_for_related_fields me permettrait de filtrer les résultats m2m que sur un répartiteur d comme ceci: d.simulations.completed() ou d.simulations.queued() mais ceux-ci ne semblent pas travailler comme je l'avais prévu. Suis-je mal comprendre comment le use_for_related_fields fonctionne, ou est-ce que je fais quelque chose de mal?

Répondre

3

De la documentation sur Using managers for related object access:

vous pouvez forcer Django à utiliser la même classe que le gestionnaire par défaut de votre modèle en définissant les use_for_related_fields attribut sur la classe gestionnaire.

Signification, dans votre cas, vous pouvez forcer d.simulation à utiliser le SimulationManager normal (et non DispatcherManager - DispatcherManager sera utilisé pour le sens opposé du lien Par exemple, Simulation.objects.get(id=1).dispatcher_set.completed.).

Je pense que la manière la plus simple d'obtenir ce que vous voulez est de définir une méthode get_completed_simulations et une méthode get_queued_simulations dans DispatcherManager. Donc, l'utilisation serait d.get_completed_simulations().

Questions connexes