【发布时间】:2010-06-04 02:49:07
【问题描述】:
在我的一个使用 MySQL 作为数据库的 Django 项目中,我需要有一个 date 字段,该字段也接受“部分”日期,例如仅年份 (YYYY) 和年份和月份 (YYYY- MM) 加上正常日期 (YYYY-MM-DD)。
MySQL 中的 date 字段可以通过接受 00 来处理月份和日期。所以 2010-00-00 在 MySQL 中是有效的,它代表 2010。2010-05-00 代表 2010 年 5 月。
所以我开始创建一个PartialDateField 来支持这个功能。但我碰壁了,因为默认情况下,Django 使用默认的 MySQLdb,即 MySQL 的 python 驱动程序,为 date 字段返回一个datetime.date 对象,并且datetime.date() 仅支持真实日期。因此可以修改 MySQLdb 使用的 date 字段的转换器,并仅返回此格式 'YYYY-MM-DD' 的字符串。不幸的是 MySQLdb 使用的转换器设置在连接级别,因此它用于所有 MySQL date 字段。但是 Django DateField 依赖于数据库返回一个 datetime.date 对象这一事实,所以如果我将转换器更改为返回一个字符串,Django 一点也不高兴。
有人有解决这个问题的想法或建议吗?如何在 Django 中创建PartialDateField?
编辑
另外我应该补充一点,我已经想到了 2 个解决方案,为年、月和日创建 3 个整数字段(如 Alison R. 所述)或使用 varchar 字段以这种格式将日期保存为字符串 YYYY-MM-DD.
但是在这两种解决方案中,如果我没记错的话,我将失去 date 字段的 special 属性,就像对它们进行此类查询一样:获取此日期之后的所有条目。我可能可以在客户端重新实现此功能,但在我的情况下这不是一个有效的解决方案,因为可以从其他系统(mysql 客户端、MS Access 等)查询数据库
【问题讨论】:
标签: python mysql database django date