我有两张桌子,想加入它们.. 但如果没有 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)
你可以试试这个:
首先,根据需要构造一个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
你可以试试这个:
sample_ids = Metadata.objects.values('sample_id')
Genome.objects.filter(query_id__in=sample_ids)
class Genome(models.Model):
query_id = models.CharField(max_length=100, unique=True)
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)
sample = models.ForeignKey(
Genome, to_field='query_id', on_delete=models.PROTECT
)
然后使用:
Metadata.objects.select_related('sample')
我建议使用 Django 的关系,不仅因为它使查询更方便,而且可能更重要的是因为它可以防止不良建模。