【问题标题】:Django - Join two Table without Foreign keyDjango - 加入两个没有外键的表
【发布时间】:2021-11-30 19:35:35
【问题描述】:

我有两张桌子,想加入他们.. 但如果没有 rawQueryset 和原始 SQL,我就无法做到这一点。

我如何没有外键连接两个模型? JOIN 的列不是唯一的,因此不能是 PK 和外键。

我想得到这样的 SQL

'SELECT * FROM genome AS A JOIN metadata AS B ON A.query_id = B.sample_id',

这是我使用的模型。


class Genome(models.Model):
    query_id = models.CharField(max_length=100) 
    ref_id = models.CharField(max_length=30)
    matching_hashes = models.CharField(max_length=30)


class Metadata(models.Model):
    project_id = models.CharField(max_length=50) # Metagenome의 query id와 JOIN함
    sample_id = models.CharField(max_length=50)

【问题讨论】:

  • 每个基因组的query_id 是唯一的吗?或者sample_id 是每个Metadata 唯一的吗?换句话说,关系在哪个方向?一对多,还是多对一?
  • query_id 和 sample_id 列在每个模型中都不是唯一的。这是多对多。

标签: python mysql django join orm


【解决方案1】:

你可以试试这个:

首先,根据需要构造一个SQL查询

sql_query = "SELECT * FROM genome AS A JOIN metadata AS B ON A.query_id = B.sample_id"

在 django DB 连接中执行 SQL 查询的用户如下:

from django.db import connection

def my_custom_sql(self):
    cursor = connection.cursor()    
    cursor.execute(sql_query)
    row = cursor.fetchall()
    return row

或者你可以尝试如下执行raw()

Genome.objects.raw(sql_query) # in some cases it may not work

【讨论】:

  • 谢谢,但是我不能用 ORM 得到 Queryset 结果吗?
  • 是的,我们可以这样做,但它可能会产生子查询并增加大量数据的执行时间
  • @Shale 我刚刚更新了答案。您可以尝试让我知道它是否不起作用。 :)
【解决方案2】:

你可以试试这个:

sample_ids = Metadata.objects.values('sample_id')
Genome.objects.filter(query_id__in=sample_ids)

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
  • 感谢您的回答.. 但我需要加入两个表 T_T ..
猜你喜欢
  • 2018-09-01
  • 1970-01-01
  • 2023-03-16
  • 2014-06-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 2014-09-11
  • 2021-03-08
相关资源
最近更新 更多