1

如何将此 SQL 转换为 Django ORM

SELECT 
  `table1`.*,
  `tabl2`.*
FROM `table1`
INNER JOIN `table2` ON (`table1`.`table2_id` = `table2`.`id`)
INNER JOIN
(SELECT
   table2_id,
   MAX(date) AS max_date
FROM table1
WHERE date <= CURRENT_DATE
GROUP BY table2_id) grouped
  ON table1.table2_id = grouped.table2_id
     AND table1.date = grouped.max_date
WHERE `table1`.`table2_id` IN (73, 74)
ORDER BY `table1`.`date` ASC

我尝试了注释,但不成功

4

1 回答 1

1

简单地说,您需要为表定义模型,即“table1”和“table2”——使用 ORM 的目的是将您的表定义为模型(一劳永逸)并轻松进行查询。

如果您定义了模式,请将其转换为 Django 模型(所有字段)。而且,如果您已经设置了数据库,请使用该inspectdb命令从数据库中自动生成模型。

您可以为特定的数据库表生成模型 - inspectdb.

检查数据库

django-admin inspectdb [table [table ...]]

内省 NAME 设置指向的数据库中的数据库表,并将 Django 模型模块(models.py 文件)输出到标准输出。您可以通过将它们的名称作为参数传递来选择要检查的表。

如果您有想要使用 Django 的旧数据库,请使用此选项。该脚本将检查数据库并为其中的每个表创建一个模型。

如您所料,创建的模型将为表中的每个字段提供一个属性。请注意,inspectdb 在其字段名输出中有一些特殊情况:

  • 如果inspectdb无法将列的类型映射到模型字段类型,它将使用 TextField 并插入 Python 注释“此字段类型是猜测”。生成模型中的字段旁边。

  • 如果数据库列名称是 Python 保留字(例如“pass”、“class”或“for”),inspectdb 将在属性名称后附加“_field”。例如,如果一个表有一个列“for”,则生成的模型将有一个字段“for_field”,其中 db_column 属性设置为“for”。inspectdb 将插入 Python 注释“字段已重命名,因为它是 Python 保留字。” 场旁边。


但是您必须手动验证自动生成的模型:

此功能是一种快捷方式,而不是确定的模型生成。运行后,您需要自己查看生成的模型以进行自定义。特别是,您需要重新排列模型的顺序,以便正确排序引用其他模型的模型。

于 2017-03-30T07:31:51.370 回答