2012-02-19 87 views
25

我來自Rails背景,在使用Django提供的「關聯方法」時遇到了一些麻煩。我有兩個型號(這已經簡化了簡潔起見),像這樣:如何使用Django ManyToMany關係的'reverse'?

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) 

根據Django文檔:

「不要緊,這模式有ManyToManyField,但你應該只將它放在其中一個模型中 - 不能兩者兼而有之。「

所以我明白,如果我有一個用戶的情況下,所謂的用戶,我可以這樣做:

user.companies 

我的問題是我怎麼做相反?如何獲取屬於一個公司實例的所有用戶,假設公司:

company.users # This doesn't work! 

什麼慣例做到這一點?我讀過的文檔並沒有真正涵蓋這一點。我需要這個協會雙向工作,所以我不能簡單地將它從一個模型轉移到另一個模型。

回答

48
company.user_set.all() 

將返回屬於某個公司的User對象的QuerySet。默認情況下,您使用modelname_set扭轉的關係,但是你可以重寫此可以提供related_name作爲參數定義模型時,即

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

> company.users.all() 

here is the relevant documentation

+0

完美的答案,感謝您的快速回復。 – 2012-02-19 20:19:10

+3

對於related_name爲+1。總是*討厭*'model_set'語法。這是如此骯髒的感覺。 – 2014-03-03 19:35:07

+0

我覺得這對我來說很_Lzy_。根據類名推斷適當的向後關係並不難。 related_name使得它更容易處理。 – 2014-12-10 02:50:00

相關問題