У меня есть 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-запроса.