【问题标题】:python - inner join 3 classes [duplicate]python - 内部加入3个类[重复]
【发布时间】:2013-12-19 04:10:03
【问题描述】:

我有一个问题,我不知道如何在 python/django 中进行内部连接(没有原始 sql)...

这是我的课:

class A(models.Model):
    parameter1 = models.CharField()

class B(models.Model):
    parameter1 = models.CharField()
    a = models.ForeignKey(a)

class C(models.Model):
    parameter1 = models.CharField()
    b = models.ForeignKey(b)

我怎样才能只使用 django 获得与此请求相同的结果:

query = A.objects.raw('SELECT * FROM A INNER JOIN B ON A.id=B.a_id INNER JOIN C ON B.id=b_id')

谢谢

【问题讨论】:

标签: python django django-models inner-join


【解决方案1】:

您可以使用 isnull 或任何其他字段查找来限制来自 A 的数据:

q = A.objects.filter(b__isnull=False, b__c__parameter1__isnull=False)

结果查询将与此类似:

SELECT "appname_A"."id", "appname_A"."parameter1" FROM "appname_A"
INNER JOIN "appname_B" ON ("appname_A"."id" = "appname_B"."a_id")
INNER JOIN "appname_C" ON ("appname_B"."id" = "appname_C"."b_id")
WHERE ("appname_C"."parameter1" IS NOT NULL AND "appname_B"."id" IS NOT NULL)
ORDER BY "appname_A"."id" ASC

如果您想从联接表中选择一个查询中的所有数据,则应使用 C 中的 select_related向后):

q = C.objects.filter(b__a__parameter1=SOMETHING).select_related()

结果查询将从:

SELECT "appname_C"."id", "appname_C"."parameter1", "appname_C"."b_id",
       "appname_B"."id", "appname_B"."parameter1", "appname_B"."a_id",
       "appname_A"."id", "appname_A"."parameter1"
INNER JOIN ...

【讨论】:

    猜你喜欢
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 2021-04-03
    • 2014-08-07
    • 1970-01-01
    • 2019-12-27
    • 2018-02-20
    相关资源
    最近更新 更多