2012-02-19 21 views
25

Pochodzę z tła Rails i mam problem z wykorzystaniem "metod asocjacyjnych" dostarczonych w Django. Mam dwa modele (które zostały uproszczone dla zwięzłości), tak jak poniżej:Jak korzystać z "odwrotności" relacji 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) 

Zgodnie z dokumentacją Django:

„To nie ma znaczenia, który model ma ManyToManyField, ale powinieneś umieścić go tylko w jednym z modeli - nie oba. ".

Więc rozumiem, że jeśli mam instancję użytkownika, wywoływany użytkownik, mogę zrobić:

user.companies 

Moje pytanie brzmi jak to zrobić na odwrót? Jak zdobyć wszystkich użytkowników należących do instancji firmy, powiedzmy firma:

company.users # This doesn't work! 

Jaka jest konwencja w tym celu? Dokumentacja, którą przeczytałem, tak naprawdę nie obejmuje tego. Potrzebuję stowarzyszenia, by działało w obie strony, więc nie mogę po prostu przenieść go z jednego modelu do drugiego.

Odpowiedz

48
company.user_set.all() 

zwróci QuerySet z User obiektów należących do danej firmy. Domyślnie użyć modelname_set odwrócenie relacji, ale można to zmienić należy zapewnienie related_name jako parametr przy określaniu modelu, tj

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

> company.users.all() 

here is the relevant documentation

+0

Idealne rozwiązanie, dzięki za szybką odpowiedź. –

+3

+1 dla related_name. Zawsze * nienawidził * składni "model_set". To takie brudne uczucie. –

+0

Myślę, że to mi się podoba. Nie jest trudno wywnioskować odpowiednią relację wstecz w oparciu o nazwy klas. Nazwa related_name znacznie ułatwia pracę z nim. –

Powiązane problemy