Django - 在没有外键的情况下连接两个表

问题描述 投票:0回答:3

我有两张桌子,想加入它们.. 但如果没有 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)
    
python mysql django join orm
3个回答
0
投票

你可以试试这个:

首先,根据需要构造一个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
    

0
投票

你可以试试这个:

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

0
投票
我不明白为什么你不能这样做。您可以使用:

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 的关系,不仅因为它使查询更方便,而且可能更重要的是因为它可以防止不良建模。

© www.soinside.com 2019 - 2024. All rights reserved.