2012-02-19 16 views
25

Provengo da uno sfondo di Rails e sto avendo un po 'di problemi nell'utilizzare i "metodi di associazione" forniti in Django. Ho due modelli (che sono state semplificate per brevità), in questo modo:Come utilizzare il "reverse" di una relazione Django ManyToMany?

class User(models.Model): 
    username = models.CharField(max_length=100, unique=True) 
    companies = models.ManyToManyField('Company', blank=True) 

class Company(models.Model): 
    name = models.CharField(max_length=255) 

Secondo la documentazione Django:

"Non importa quale modello ha la ManyToManyField, ma dovresti metterlo solo in uno dei modelli, non in entrambi ".

così ho capito che se ho un'istanza di un utente, utente chiamato, non posso fare:

user.companies 

La mia domanda è come faccio a fare il contrario? Come faccio ad avere tutti gli utenti che appartengono a un'istanza società, diciamo Società:

company.users # This doesn't work! 

Qual è la convenzione per fare questo? La documentazione che ho letto in realtà non copre questo. Ho bisogno che l'associazione lavori in entrambi i modi, quindi non posso semplicemente spostarla da un modello all'altro.

risposta

48
company.user_set.all() 

restituirà un QuerySet di User oggetti che appartengono a una particolare azienda. Di default si utilizza modelname_set di invertire il rapporto, ma è possibile ignorare questa fornire un related_name come parametro durante la definizione del modello, vale a dire

class User(models.Model): 
    companies = models.ManyToManyField(User, ..., related_name="users") 

> company.users.all() 

here is the relevant documentation

+0

risposta perfetta, grazie per la risposta rapida. –

+3

+1 per related_name. Sempre * odiava * la sintassi 'model_set'. È una sensazione così sporca. –

+0

Penso che mi sento _lazy_ per me. Non è difficile dedurre una relazione all'indietro appropriata in base ai nomi delle classi. Il related_name rende molto più facile lavorare con se. –

Problemi correlati