2010-10-02 4 views
5

Ho due modelli che hanno in qualche modo molte relazioni con una tabella 'attraverso'?Posso aggiungere un manager a una moltitudine di relazioni?

class Bike(models.Model): 
    nickname = models.CharField(max_length=40) 
    users = models.ManyToManyField(User, through='bike.BikeUser') 

La classe BikeUser

class BikeUser(models.Model): 
    bike  = models.ForeignKey(Bike) 
    user  = models.ForeignKey(User) 
    comment = models.CharField(max_length=140) 

vorrei aggiungere funzionalità alla classe Bike per lavorare con gli utenti, c'è un modo migliore pratica di fare questo. Vorrei evitare di aggiungere troppi metodi alla classe Bike e piuttosto avere un qualche tipo di manager per lavorare attraverso

Qualcosa di simile:

bike.bikeusers_set.commonMethod() 

o

bike.bikeusers.commonMethod() 

Quale sarebbe il migliore modo per realizzare questo?

risposta

6

Una volta ottenuto il modello BikeUser, è possibile aggiungere un gestore personalizzato al modello.

Qualcosa di simile:

class BikeUserManager(models.Manager): 
    def commonMethod(): 
     pass 

class BikeUser(models.Model): 
    bike  = models.ForeignKey(Bike) 
    user  = models.ForeignKey(User) 
    comment = models.CharField(max_length=140) 
    objects = BikeUserManager() 

ma si può usare solo dal modello BikeUser:

BikeUser.objects.commonMethod() 

quello che vuoi è di utilizzare questo manager come un manager correlato: http://docs.djangoproject.com/en/dev/topics/db/managers/#controlling-automatic-manager-types

Aggiungi use_for_related_fields=True alla classe manager.

class MyManager(models.Manager): 
    use_for_related_fields = True 
+0

Grazie, ha funzionato come un fascino! Howerver, se chiamo il manager da una bici instanciata bike.bikeuser_set.commonMethod() Come accedere alla "bici" da commonMethod? (dovrebbe essere una nuova domanda?) – Joelbitar

+0

Penso che dovrai aggiungerlo come parametro di funzione: def commonMethod (self, bike) e usarlo in questo modo: bike.bikeuser_set.commonMethod (bicicletta) – OmerGertel

+0

Ecco cos'è 'Ho fatto, ho pensato che ci fosse un modo migliore, grazie comunque! – Joelbitar