【问题标题】:Converting raw sql query to Django ORM将原始 sql 查询转换为 Django ORM
【发布时间】:2019-06-11 21:30:02
【问题描述】:

我的项目中有 3 个模型,如下所示:

class Model_A(Models.Model):
  field_a_1 = models.IntegerField()
  ...other fields...

class Model_C(models.Model):
   field_c_1 = models.IntegerField()
   field_c_2 = models.IntegerField()
   ...other fields...

class Model_B(Model_C):
   table_a_fk_id = ChainedForeignKey(Model_A, .... ) 
   ...other fields...

因为在我的数据库中,我有以下三个表:

Table_A(id, name, field_a_1, ...other fields....)                    
Table_B(id, table_a_fk_id, table_c_fk_id, .....other fields...)     
Table_C(id, field_c_1, field_c_2, ...other fields....) 

我需要一个查询来检索这样的输出数据:

Table_A_id  Table_A_name                count
------------------------------------------------
12          Table_A_name_12               138
1           Table_A_name_1                133
13          Table_A_name_13                55
15          Table_A_name_15                38
9           Table_A_name_9                 34
7           Table_A_name_7                  0
19          Table_A_name_19                 0

我已经用原始 sql 查询解决了这个问题,但我不知道如何在 Django ORM 中做同样的事情。 这是我的 SQL 代码:

SELECT `Table_A`.`id` AS 'Table_A_id', `Table_A`.`nome` AS 'Table_A_name',
COUNT(`ptr`.`table_a_fk_id`) AS `count`
FROM `Table_A`
LEFT OUTER JOIN (
    SELECT `Table_C`.`id`, `Table_B`.`table_a_fk_id`
    FROM `Table_B`
    INNER JOIN `Table_C`
    ON ( `Table_B`.`table_c_fk_id` =`Table_C`.`id`)
    WHERE (
        `Table_B`.`table_a_fk_id` = xx
        AND `Table_C`.`field_c_1` = yy
        AND `Table_C`.`field_c_2` = zz
        ...other constraints on Table_C fields....
        )
    ) ptr
ON (`Table_A`.`id` = `ptr`.`table_a_fk_id`)
WHERE (`Table_A`.`field_a_1` = x )
GROUP BY `Table_A`.`id`
ORDER BY `count` DESC, `name` ASC

我想在 Django ORM 中翻译上述 sql 以避免执行原始 sql 查询。

【问题讨论】:

    标签: mysql sql django django-orm


    【解决方案1】:

    实际上,可以说,在这种情况下,您有理由要求 Django 执行“原始查询”,当然您可以这样做。

    我要提出的论点是——清晰。您正在做的事情显然很复杂,但是它被所有程序员都熟知的 SQL 语法简洁地描述了。 (而且,如果需要......而且,众所周知,它不可避免......它可以很容易地更改。)

    我认为因此我可以证明您有理由在这里使用直接 SQL。如果我是你的团队负责人,我可能会建议这样做。

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 2019-04-03
      • 2015-08-23
      • 1970-01-01
      • 2020-07-13
      • 2019-12-10
      • 2016-04-20
      • 2020-09-12
      相关资源
      最近更新 更多