gpt4 book ai didi

python - Django 在保留 ORM 的同时连接两个表

转载 作者:行者123 更新时间:2023-11-29 22:27:57 25 4
gpt4 key购买 nike

使用 Django,我尝试使用 Django 从数据库中获取这个特定的结果 View :

select * from CO2_Low_Adj a JOIN CO2_Low_Metrics b on a.gene_id_B = b.gene_id where a.gene_id_A='Traes_1AL_00A8A2030'

我知道我可以使用连接、游标、fetchall 来做到这一点并获取字典列表。然而,我想知道是否有一种方法可以在 Django 中做到这一点,同时保留 ORM。

表格如下所示:

class Co2LowMetrics(models.Model):
gene_id = models.CharField(primary_key=True, max_length=24)
modular_k = models.FloatField()
modular_k_rank = models.IntegerField()
modular_mean_exp_rank = models.IntegerField()
module = models.IntegerField()
k = models.FloatField()
k_rank = models.IntegerField()
mean_exp = models.FloatField()
mean_exp_rank = models.IntegerField()
gene_gene = models.ForeignKey(Co2LowGene, db_column='Gene_gene_id') # Field name made lowercase.

class Meta:
managed = False
db_table = 'CO2_Low_Metrics'

class Co2LowGene(models.Model):
gene_id = models.CharField(primary_key=True, max_length=24)
entry = models.IntegerField(unique=True)
gene_gene_id = models.CharField(db_column='Gene_gene_id', max_length=24) # Field name made lowercase.

class Meta:
managed = False
db_table = 'CO2_Low_Gene'

class Co2LowAdj(models.Model):
gene_id_a = models.CharField(db_column='gene_id_A', max_length=24) # Field name made lowercase.
edge_number = models.IntegerField(unique=True)
gene_id_b = models.CharField(db_column='gene_id_B', max_length=24) # Field name made lowercase.
value = models.FloatField()
gene_gene_id_a = models.ForeignKey('Co2LowGene', db_column='Gene_gene_id_A') # Field name made lowercase.
gene_gene_id_b = models.ForeignKey('Co2LowGene', db_column='Gene_gene_id_B') # Field name made lowercase.

class Meta:
managed = False
db_table = 'CO2_Low_Adj'

数据库表描述为:

mysql> describe CO2_Low_Metrics;
+-----------------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------------+-------------+------+-----+---------+-------+
| gene_id | varchar(24) | NO | PRI | NULL | |
| modular_k | double | NO | | NULL | |
| modular_k_rank | int(8) | NO | | NULL | |
| modular_mean_exp_rank | int(8) | NO | | NULL | |
| module | int(8) | NO | | NULL | |
| k | double | NO | | NULL | |
| k_rank | int(8) | NO | | NULL | |
| mean_exp | double | NO | | NULL | |
| mean_exp_rank | int(8) | NO | | NULL | |
| Gene_gene_id | varchar(24) | NO | MUL | NULL | |
+-----------------------+-------------+------+-----+---------+-------+

mysql> describe CO2_Low_Gene;
+--------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+----------------+
| gene_id | varchar(24) | NO | PRI | NULL | |
| entry | int(8) | NO | UNI | NULL | auto_increment |
| Gene_gene_id | varchar(24) | NO | | NULL | |
+--------------+-------------+------+-----+---------+----------------+

mysql> describe CO2_Low_Adj;
+----------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+-------------+------+-----+---------+----------------+
| gene_id_A | varchar(24) | NO | MUL | NULL | |
| edge_number | int(9) | NO | PRI | NULL | auto_increment |
| gene_id_B | varchar(24) | NO | MUL | NULL | |
| value | double | NO | | NULL | |
| Gene_gene_id_A | varchar(24) | NO | MUL | NULL | |
| Gene_gene_id_B | varchar(24) | NO | MUL | NULL | |
+----------------+-------------+------+-----+---------+----------------+

假设我没有能力更改底层数据库架构。这可能会改变,如果建议可以帮助您更轻松地使用 Django 的 ORM,那么我可以尝试对其进行更改。

但是,我一直在尝试使用 prefetch_lated 和 select_lated 但我做错了一些事情并且没有让一切恢复正常。

通过我的 SQL 查询,我基本上按照 CO2_Low_Adj 然后 CO2_Low_Metrics 的顺序获取所描述的表,其中gene_id_A 与gene_gene_id_A 相同('Traes_1AL_00A8A2030'),gene_id_B 与gene_gene_id_B 相同。 CO2_Low_Gene 似乎根本没有与 SQL 查询一起使用。

谢谢。

最佳答案

Django 无法在没有外键的情况下执行 JOIN 查询。这就是为什么 prefetch_latedselect_lated 不起作用 - 它们作用于外键。

我不确定您想要实现什么目标。由于您的 gene_id 是唯一的,因此只有一个 CO2_Low_Metrics 实例和一组 adj 实例:

adj = CO2_Low_Adj.objects.filter(gene_id_A='Traes_1AL_00A8A2030') 
metrics = CO2_Low_Metrics.objects.get(pk='Traes_1AL_00A8A2030')

然后处理一个单独的列表。

关于python - Django 在保留 ORM 的同时连接两个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30088787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com