是否可以通过指定 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 名称对没有外键的表应用连接?的主要内容,如果未能解决你的问题,请参考以下文章