在我的一个使用 MySQL 作为数据库的 Django 项目中,我需要一个date还接受“部分”日期的字段,例如仅年份 (YYYY) 和年份和月份 (YYYY-MM) 加上正常日期 (YYYY-MM-DD)。
The dateMySQL 中的字段可以通过接受来处理00对于月份和日期。所以2010-00-00在 MySQL 中有效,它代表 2010 年。同样的事情2010-05-00代表 2010 年 5 月。
所以我开始创建一个PartialDateField
以支持此功能。但我碰壁了,因为默认情况下,Django 使用默认的 MySQLdb,MySQL 的 python 驱动程序,返回一个datetime.date
对象为一个date场与datetime.date()
仅支持真实日期。所以可以修改转换器dateMySQLdb 使用的字段,仅返回此格式的字符串'年-月-日'。不幸的是,MySQLdb 使用的转换器是在连接级别设置的,因此它可用于所有 MySQLdate字段。但是姜戈DateField
依赖于数据库返回一个事实datetime.date
对象,所以如果我更改转换器以返回字符串,Django 一点也不高兴。
有人有解决这个问题的想法或建议吗?如何创建一个PartialDateField
在姜戈?
EDIT
另外我应该补充一点,我已经想到了 2 个解决方案,为年、月和日创建 3 个整数字段(如艾莉森·R。)或使用varchar将日期保存为这种格式的字符串的字段年-月-日.
但在这两种解决方案中,如果我没有错的话,我都会失去special的属性date字段就像对它们进行此类查询:获取该日期之后的所有条目。我可能可以在客户端重新实现此功能,但这在我的情况下不是一个有效的解决方案,因为数据库可以从其他系统(mysql 客户端、MS Access 等)进行查询
首先,感谢您的所有回答。它们都不是解决我的问题的良好解决方案,但是,为了您的辩护,我应该补充一点,我没有给出所有要求。但每个人都帮助我思考我的问题,你的一些想法是我最终解决方案的一部分。
所以我在数据库方面的最终解决方案是使用varchar字段(限制为 10 个字符)并将日期作为字符串以 ISO 格式 (YYYY-MM-DD) 存储在其中00对于没有月份和/或日期的月份和日期(例如dateMySQL 中的字段)。这样,该字段可以与任何数据库一起使用,人们可以使用简单的客户端(如 mysql 客户端、phpmyadmin 等)直接轻松地读取、理解和编辑数据。这是一个要求。它还可以导出到 Excel/CSV,无需任何转换等。缺点是格式不强制(Django 中除外)。有人可以写“不是约会”或者在格式上犯了一个错误,数据库会接受它(如果你对这个问题有想法......)。
这样也可以完成所有的操作special的查询date领域相对容易。对于使用 WHERE 的查询:、= 和 = 直接工作。 IN 和 BETWEEN 查询也可以直接工作。要按天或月查询,您只需使用 EXTRACT (DAY|MONTH ...) 即可。也可以直接订购工作。所以我认为它涵盖了所有查询需求,并且基本上没有复杂性。
在 Django 方面,我做了两件事。首先,我创建了一个PartialDate
看起来很像的物体datetime.date
但支持不带月份和/或日期的日期。在这个对象中,我使用 datetime.datetime 对象来保存日期。我使用小时和分钟作为标志,告诉月份和日期设置为 1 时是否有效。这是相同的想法steveha提出但具有不同的实现(并且仅在客户端)。用一个datetime.datetime
object 为我提供了许多处理日期的好功能(验证、比较等)。
其次,我创建了一个PartialDateField
主要处理之间的转换PartialDate
对象和数据库。
到目前为止,它运行得很好(我已经基本完成了广泛的单元测试)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)