Django ORM加入没有外键和没有原始查询

时间:2016-09-02 11:33:01

标签: django join orm

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"'

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联合的模型。

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

2 个答案:

答案 0 :(得分:1)

这将有效:

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"})

答案 1 :(得分:0)

当前方法是使用子查询和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]
))