【问题标题】:Joining three or more tables using django ORM使用 django ORM 连接三个或更多表
【发布时间】:2012-12-30 21:02:46
【问题描述】:

我已经设计了我的模型,使得所有模型在 auth_user 表(User)上都具有一对一的关系。为了您的快速参考,我将图片粘贴在下面

现在我想选择表 BasicDetails、Department 和 Project 中与用户名相关的所有数据。以下查询未获取结果。

User.objects.select_related().get(username='user1')

有人可以帮我解决这个问题吗?

-维克拉姆

【问题讨论】:

    标签: django join orm


    【解决方案1】:

    您应该使用 prefetch_related 来提高效率,因为您的关系是反向的(您想从 User 访问其他记录,而不是相反):

    u = User.objects.prefetch_related('project_set', 'department_set', 'basicdetails_set').get(username='user1')
    

    这不会生成单个查询,但 Django 将使用缓存技术来有效地减少可能的数据库开销。如果我没记错的话,它将产生 4 个查询(4 个表中的单个连接可能会更慢,具体取决于记录、索引等的数量)。好处是在后续请求中不会生成查询。例如获取用户的项目:

    u.project_set.all() #hits the db
    u.project_set.all() #cached version, no db hit
    

    更多信息请看这里https://docs.djangoproject.com/en/dev/topics/db/queries/#one-to-one-relationships

    编辑:project_set 是什么?

    如果你的项目模型是这样定义的

    class Project(models.Model):
        ...
        user = models.ForeignKey(User)
    

    那么您可以通过Project.objects.get(pk=1).user 访问与项目实例关联的用户,但是您将如何做相反的事情(获取某个用户的所有项目)?为方便起见,Django 会自动将 '_set' 属性包含到另一个模型中。因此我们可以这样获取某个用户的项目:

    u = User.objects.get(pk=1)
    user_objects = u.project_set.all()
    

    但是,如果您想显式设置此反向关系的名称,django 允许您使用 related_name 关键字参数定义 ForeignKey,如下所示:

    class Project(models.Model):
        ...
        user = models.ForeignKey(User, related_name='projects')
    

    现在您可以使用.projects 代替.project_set 来访问用户的项目:

    u = User.objects.get(pk=1)
    user_objects = u.projects.all()
    

    【讨论】:

    • 我只是想知道 project_set 是什么?项目表中的字段?
    • 您好,我刚刚更新了我的答案。我希望不要混淆你,我的英语不太好:)
    • 嘿petrid,你知道如何合并多个user_object吗?
    • 对不起,我不明白这个问题。我只是检查了代码,以防我遗漏了什么并且一切正常。你有没有发现什么不对劲?你指的是我的编辑吗?我已经对答案进行了几次编辑,以提高其英语水平。
    猜你喜欢
    • 2020-12-27
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2014-06-19
    • 2020-09-18
    • 2018-06-24
    相关资源
    最近更新 更多