2012-02-19 88 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

相关问题