Django ORM 连接无需外键且无需原始查询

问题描述 投票:0回答:2

A

class AKeywords(models.Model):
    id = models.AutoField(primary_key=True, db_column="kw_id")
    word = models.CharField(max_length=200)
    ...

    class Meta:
        managed = False
        db_table = '"A"."Keywords"'

B

class BKeywords(models.Model):
    id = models.AutoField(primary_key=True, db_column="kw_id")
    word = models.CharField(max_length=200)
    ...
    class Meta:
        managed = False
        db_table = '"B"."Keywords"'

我有另一个模型,我想在其中执行我的连接。

class XKeywords(models.Model):
    ...
    k_id = models.IntegerField(blank=True, null=True)
    ...

    class Meta:
        managed = False
        db_table = '"public"."XKeywords"'

我有两个非常相似的模型,一个来自数据库模式,另一个来自另一个数据库模式。 我想要第三个模型,它将与表 A 或 B 连接。

如何在不使用外键和原始查询的情况下加入模型 A 或 B?

django join orm
2个回答
23
投票

当前的方法是使用

Subquery
OuterRef
:

示例取自我的代码。

Store
StoreInformation
有一个名为
store_number
的字段。

from django.db.models import Subquery, OuterRef

Store.objects.annotate(timezone=Subquery(
      StoreInformation.objects.filter(store_number=OuterRef('store_number')).values('store_timezone')[:1]
))

这是加入一个名为

store_timezone
的字段。


3
投票

这会起作用:

XKeywords.objects.filter(pk_id=my_id).extra(select={'word':'SELECT word FROM "A"."Keywords" WHERE "public"."XKeywords".k_id = "A"."Keywords".kw_id'})

raw_sql = """SELECT * FROM (SELECT * FROM "public"."XKeywords" WHERE pk_id = my_id) as "XK" LEFT OUTER JOIN  "A"."Keywords" as "AK" ON "AK".kw_id = "XK".k_id ;"""
XKeywords.objects.raw(raw_sql)

这是一种解决方法,我期待一些更“聪明”的东西。如果有更直接的东西就好了:

XKeywords.objects.filter(pk_id=my_id).join(k_id=A.kwd,from={"AKeywords":"A"})
© www.soinside.com 2019 - 2024. All rights reserved.