2012-02-19 22 views
25

Vengo de un fondo de Rails y estoy teniendo problemas para utilizar los "Métodos de asociación" proporcionados en Django. Tengo dos modelos (que han sido simplificados en aras de la brevedad), así:¿Cómo usar el "reverso" de una relación 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) 

De acuerdo con la documentación de Django:

"No importa qué modelo tiene la ManyToManyField, pero solo debes ponerlo en uno de los modelos, no en ambos ".

por lo que entiendo que si tengo una instancia de un usuario, el usuario llamado, que puedo hacer:

user.companies 

Mi pregunta es ¿cómo lo hago al revés? ¿Cómo llego a todos los usuarios que pertenecen a una instancia de la empresa, digamos Empresa:

company.users # This doesn't work! 

¿Cuál es la convención para hacer esto? La documentación que he leído realmente no cubre esto. Necesito que la asociación funcione en ambos sentidos, por lo que no puedo simplemente moverla de un modelo a otro.

Respuesta

48
company.user_set.all() 

devolverá un QuerySet de User objetos que pertenecen a una empresa en particular. Por defecto se utiliza modelname_set para invertir la relación, pero se puede anular este proporcionará una related_name como un parámetro en la definición del modelo, es decir

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

> company.users.all() 

here is the relevant documentation

+0

respuesta perfecta, gracias por la rápida respuesta. –

+3

+1 para nombre_relacionado. Siempre * odiado * la sintaxis 'model_set'. Es un sentimiento tan sucio –

+0

Creo que me siento muy bien. No es difícil inferir una relación hacia atrás apropiada basada en nombres de clase. Sin embargo, related_name hace que sea mucho más fácil trabajar con él. –

Cuestiones relacionadas