如何使用Django ManyToMany关系的"反向"?

Mik*_*cic 40 django django-models

我来自Rails背景,并且在使用Django中提供的"关联方法"时遇到了一些麻烦.我有两个模型(为了简洁起见已经简化),如下所示:

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)
Run Code Online (Sandbox Code Playgroud)

根据Django文档:

"具有ManyToManyField的模型无关紧要,但您只应将其放在其中一个模型中 - 而不是两者."

所以我理解,如果我有一个用户的实例,称为用户,我可以这样做:

user.companies
Run Code Online (Sandbox Code Playgroud)

我的问题是如何反过来?如何获取属于公司实例的所有用户,假设公司:

company.users # This doesn't work!
Run Code Online (Sandbox Code Playgroud)

这样做的惯例是什么?我读过的文档并没有真正涵盖这一点.我需要关联工作两种方式,所以我不能简单地将它从一个模型移动到另一个模型.

Tim*_*ony 72

company.user_set.all()
Run Code Online (Sandbox Code Playgroud)

将返回User属于特定公司的对象的QuerySet .默认情况下,您可以使用modelname_set反转关系,但是您可以覆盖它,related_name在定义模型时提供一个参数,即

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

> company.users.all()
Run Code Online (Sandbox Code Playgroud)

这是相关文档

  • +1为related_name.始终*讨厌''model_set'语法.这是如此肮脏的感觉. (9认同)
  • 为什么 company = models.ManyToManyField(User, ..., related_name="users") 而不是 Companies = models.ManyToManyField(Company, ..., related_name="users") ? (4认同)