【问题标题】:How to use the 'reverse' of a Django ManyToMany relationship?如何使用 Django ManyToMany 关系的“反向”?
【发布时间】:2012-03-10 07:03:04
【问题描述】:

我来自 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)

根据 Django 文档:

“哪个模型具有 ManyToManyField 并不重要,但您应该只将它放在其中一个模型中——而不是两者。”。

所以我明白,如果我有一个名为 user 的用户实例,我可以这样做:

user.companies

我的问题是我该如何做相反的事情?如何获取属于公司实例的所有用户,比如说公司:

company.users # This doesn't work!

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

【问题讨论】:

    标签: django django-models


    【解决方案1】:
    company.user_set.all()
    

    将返回属于特定公司的User 对象的查询集。默认情况下,您使用modelname_set 来反转关系,但您可以在定义模型时提供related_name 作为参数来覆盖它,即

    class User(models.Model):
        companies = models.ManyToManyField(Company, ..., related_name="users")
    
    > company.users.all()
    

    here is the relevant documentation

    【讨论】:

    • related_name 为 +1。总是讨厌 'model_set' 语法。好肮脏的感觉。
    • 我觉得这对我来说是懒惰。根据类名不难推断出适当的向后关系。不过,related_name 使它更容易使用。
    • 在类似情况下仍然给我对象没有属性错误
    • 为什么公司 = models.ManyToManyField(User, ..., related_name="users") 而不是公司 = models.ManyToManyField(Company, ..., related_name="users") ?跨度>
    • @Nico Zimmer 它指定关系的远程端(具有类公司)。本地是隐式的(此处为 User 类,因为这是定义所在的位置)。 “有趣的事情”是您指定如何在 User 类中调用 Company 类中的字段。请注意,这个“related_name”的东西不仅仅用于化妆品用途;一种模型可能与另一种模型有几种不同的关系(例如,Company 有一种关系“super_users”、另一种关系“blocked_users”和第三种关系“普通用户”,所有这些都赋予 User 对象 - 具有不同的语义。
    猜你喜欢
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-14
    • 2018-09-25
    • 2014-05-27
    • 2022-06-22
    • 2012-07-08
    • 2012-02-27
    相关资源
    最近更新 更多