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?
答案 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]
))