【问题标题】:converting sql to Django ORM将 sql 转换为 Django ORM
【发布时间】:2017-08-23 22:41:25
【问题描述】:

如何将此 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

我尝试了注释,但不成功

【问题讨论】:

    标签: mysql sql django django-orm django-aggregation


    【解决方案1】:

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

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

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

    检查数据库

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

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

    如果您有想要使用的旧数据库,请使用此选项 姜戈。该脚本将检查数据库并为 里面的每个表。

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

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

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


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

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

    【讨论】:

    • 我已经有了这些模型,现在我想实现将这个SQL转换为Django ORM。像这个 Model1.objects.filter()
    猜你喜欢
    • 2020-09-12
    • 2020-09-08
    • 2020-10-31
    • 2019-04-03
    • 2022-08-18
    • 2021-07-06
    • 2019-06-11
    • 2016-04-20
    相关资源
    最近更新 更多