Преобразование необработанного SQL-запроса в Django ORM - PullRequest
0 голосов
/ 17 января 2019

У меня есть 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

Я хочу перевести вышеуказанный sql в Django ORM, чтобы избежать выполнения необработанного SQL-запроса.

1 Ответ

0 голосов
/ 17 января 2019

На самом деле можно утверждать, что в этом случае будет оправданным, если вы попросите Джанго выполнить «необработанный запрос», что, конечно, вы можете сделать.

Я бы привел аргумент - ясность. То, что вы делаете, очевидно, сложно, , но это кратко описывается синтаксисом SQL, который хорошо известен всем программистам. (И, если возникнет необходимость ... и, как мы все знаем, это неизбежно произойдет ... это может быть изменено легко.)

Я думаю, что я мог бы поэтому доказать, что вам было бы оправданно использовать прямой SQL здесь. Если бы я был твоим руководителем команды, это, вероятно, я бы предложил.

...