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

标签 python mysql django orm connection

使用 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/

相关文章:

c++ - 其他语言中最接近 Apache Hadoop 的是什么?

python - 如何删除字符串中某个字符后的所有内容?

python - django 迁移 "No migrations to apply."

django - Heroku/Django/S3 : Static files not serving from S3, 即使媒体正在工作

python - 多边形内的轮廓不规则数据

java - 从 Pdf 标题重命名 Pdf

php - 从多个表中选择并返回全部

php - 使用php编辑mysql记录数据库

mysql - 根据时间跨度查询创建新字段

django - 如何在 Webfaction 服务器上安装 Mezzanine