是否可以通过指定 id 名称对没有外键的表应用连接?

Posted

技术标签:

【中文标题】是否可以通过指定 id 名称对没有外键的表应用连接?【英文标题】:is it possible to apply join on tables which do not have foreign key, by specifying the id name? 【发布时间】:2020-01-12 21:06:19 【问题描述】:

我有一个没有外键约束的预制数据库。 我想知道我们是否可以在没有外键的情况下在 django ORM 中应用 join(我知道这不是最佳做法,但由于它是预制的架构,我无法更改它)。

我查了一下,但没有找到符合我要求的解决方案。 我尝试了以下,

https://books.agiliq.com/projects/django-orm-cookbook/en/latest/join.html

Join over django models

https://www.caktusgroup.com/blog/2009/09/28/custom-joins-with-djangos-queryjoin/

https://www.quora.com/How-do-I-join-tables-in-Django

我有 表1

TId = models.BigIntegerField(primary_key=True)
    field1 = models.FloatField(null=True, blank=True, default=None)
    field2 = models.CharField(max_length=10, default=None)
    field3 = models.CharField(max_length=10, default=None)
    field4 = models.CharField(max_length=10, default=None)

和表2,

SId = models.BigIntegerField(primary_key=True)
    field5 = models.FloatField(null=True, blank=True, default=None)
    field6 = models.CharField(max_length=10, default=None)
    field7 = models.CharField(max_length=10, default=None)
    field8 = models.CharField(max_length=10, default=None)

我希望查询是,

select t1.field1, t1.field2, t2.field5 from table1 t1 inner/outer/left/right join table2 t2 on t1.TId = t2.SId 
where t2.field7 = "value";

【问题讨论】:

即使没有外键约束也可以进行连接,但两个表的列应该代表相同的数据。如果您的TID=1 有关于 X 记录的数据,并且SID=1 也有相同 X 实体的数据,那么您可以加入。首先说明您在这两个表中的数据类型以及加入它们的原因。 【参考方案1】:

Django 不关心外键约束。无论如何,您都可以将您的字段声明为外键。

例如:

class Table2(models.Model):
    SId = models.OneToOneField('Table1', primary_key=True, db_column='SId')
    ...

现在你可以这样做了:

Table2.objects.filter(field7='value').values_list('SId__field1', 'SId__field2', 'field5')

【讨论】:

你能给我举个例子吗?

以上是关于是否可以通过指定 id 名称对没有外键的表应用连接?的主要内容,如果未能解决你的问题,请参考以下文章

where 从具有列外键的表中查询

sqlserver 删除表 外键

7 多表操作

Laravel - 如何将外键用于具有识别外键的表?

查询带外键的表

是否可以在柴油中使用没有主键的表?锈