【问题标题】:Django-MySQL is unable to recognise model.column in queryset extra?Django-MySQL 无法识别额外查询集中的 model.column?
【发布时间】:2017-11-14 00:26:27
【问题描述】:

我的本​​地机器和开发机器上分别安装了 SQLite 和 MySQL。以下在我的本地机器上运行良好(使用 SQLite):

select_single = {'date': "strftime('%%Y-%%m-%%d',projectName_Modelname.created)"}
queryset.extra(select=select_single)

但由于strftime 不适用于 MySQL(link),我也尝试按照给定链接和其他地方的建议使用 DATE_FORMAT()。 虽然现在当我在下面执行时:

select_single = {'date': "DATE_FORMAT(projectName_Modelname.created, '%%Y-%%m-%%d')"}
queryset.extra(select=select_single)

以下错误来了:

DatabaseError: (1054, "Unknown column 'projectName_Modelname.created' in 'field list'")

“created”是应用程序“projectName”的 Django 模型“Modelname”中的 Datetime 字段

当我将projectName_Modelname.created 替换为NOW() 时进行调试,不会出现错误。我也试过 Modelname.created 而不是 projectName_Modelname.created 虽然没有任何好处?

注意:我使用的是 Django1.5.5

【问题讨论】:

  • Django 1.5.5 已经过时多年了。几乎没有人记得现在如何使用额外的,最后但并非最不重要的一点是,始终尝试在本地和生产中使用相同的 RDBMS 以避免完全此类问题
  • 您能解释一下为什么要这样做吗?在 Python 或模板中格式化输出日期要简单得多。
  • @e4c5 这是关于我正在维护的一个项目,并且请求进行一些修改。
  • @DanielRoseman 如果我无法修改这个,我最终会重构整个部分

标签: mysql django django-queryset


【解决方案1】:

我认为应该是这样的:

date_raw_query = {'date': "date_format(created, '%%Y-%%m-%%d')"}

然后尝试

queryset.extra(select=date_raw_query)

希望这适用于您的设置。我已经在 Django 1.7 和 MySQL 上尝试过,似乎可以正常工作。

另外请记住,如果开始出现 SQL 错误,您可以随时发送print queryset.extra(select=date_raw_query).query 以查看可能出现的问题。

当谈到像这样在 SQLite 和 MySQL 之间编写兼容代码时,有人建议编写自定义 MySQL 函数here

但我建议不这样做。最好在本地有一个类似的开发环境和 MySQL 设置,并且尽快升级 Django。 :P

【讨论】:

  • 我在尝试您的建议时收到了DatabaseError: (1052, "Column 'created' in field list is ambiguous")。虽然在分析 MySQL 查询时,我发现 modelname 已更改为全小写,但 projectname 是驼峰式(如 projectName_modelname)。因此,我将其更改为 projectName_modelname.created 并且成功了!谢谢。
猜你喜欢
  • 2016-02-21
  • 2015-01-05
  • 1970-01-01
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2019-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多