【问题标题】:InnerJoin query on Django QuerySetDjango QuerySet 上的内部联接查询
【发布时间】:2012-10-31 07:40:05
【问题描述】:

我在 django 中有这些数据模型:

class User(models.Model):
     type = models.CharField()

class Tmp1(models.Model):
     var1 = models.ForeignKey(User)

class Tmp2(models.Model):
     var2 = models.ForeignKey(Tmp1)

class Tmp3(models.Model):
     user = models.ForeignKey(User)
     var3 = models.ForeignKey(Tmp2)

我想要一个Tmp3 查询集,它选择Tmp3 的实例,其中Tmp3.var3.var2.var1.id 等于Tmp3.user.id.

我知道应该如何在 PostgreSQL 中使用 InnerJoin,但我不知道如何使用 Django 查询集。

【问题讨论】:

  • django 的一个特点是它与 db 无关。对于 ORM,这并不是一个特别复杂的查询。

标签: django postgresql django-queryset


【解决方案1】:

据我了解,您希望获得Tmp3 对象,其中它们的user 属性与Tmp1 表中的相关用户匹配(对于当前Tmp3 对象)-听起来您可以使用F expressions

from django.db.models import F
Tmp3.objects.filter(var3__var2__var1=F('user'))

【讨论】:

    【解决方案2】:

    尝试以下方法:

    object_q = 1
    tmp3_pk = Tmp3.objects.get(pk=object_q).user.pk
    queryset = Tmp3.objects(var3__var2__var1__pk=tmp3_pk)
    

    __(双下划线)将引用相关模型的属性。

    你也可以直接引用对象:

    object_q = 1
    tmp3_user = Tmp3.objects.get(pk=object_q).user
    queryset = Tmp3.objects(var3__var2__var1=tmp3_user)
    

    在此处查看跨相关对象执行查询的完整详细信息: https://docs.djangoproject.com/en/dev/topics/db/queries/#related-objects

    【讨论】:

    • @pooria 在您投反对票之前,您是否尝试过此解决方案?你明白你在问什么问题吗?您了解查询仅对实例化数据执行吗?
    • 对帖子投反对票需要超过 125 的声望。我只有 76 个 :)。你的回答是无关紧要的,也许这就是为什么有人反对它。
    • 另外,我刚刚尝试了这个查询,它确实有效。尽管您的模型存在问题(在 django 意义上)。
    猜你喜欢
    • 2019-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-01
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多