如何在 Django 中处理来自 MySQL 的“部分”日期(2010-00-00)?

2023-11-27

在我的一个使用 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.datetimeobject 为我提供了许多处理日期的好功能(验证、比较等)。

其次,我创建了一个PartialDateField主要处理之间的转换PartialDate对象和数据库。

到目前为止,它运行得很好(我已经基本完成了广泛的单元测试)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Django 中处理来自 MySQL 的“部分”日期(2010-00-00)? 的相关文章

  • 如何使用 imaplib 获取“消息 ID”

    我尝试获取一个在操作期间不会更改的唯一 ID 我觉得UID不好 所以我认为 Message ID 是正确的 但我不知道如何获取它 我只知道 imap fetch uid XXXX 有人有解决方案吗 来自 IMAP 文档本身 IMAP4消息号
  • 通过列表理解压平列表列表

    我正在尝试使用 python 中的列表理解来展平列表 我的清单有点像 1 2 3 4 5 6 7 8 只是为了打印这个列表列表中的单个项目 我编写了这个函数 def flat listoflist for item in listoflis
  • if 语句未命中中的 continue 断点

    在下面的代码中 两者a and b是生成器函数的输出 并且可以评估为None或者有一个值 def testBehaviour self a None b 5 while True if not a or not b continue pri
  • 如何在 pytest 中将单元测试和集成测试分开

    根据维基百科 https en wikipedia org wiki Unit testing Description和各种articles https techbeacon com devops 6 best practices inte
  • Pandas 中允许重复列

    我将一个大的 CSV 包含股票财务数据 文件分割成更小的块 CSV 文件的格式不同 像 Excel 数据透视表之类的东西 第一列的前几行包含一些标题 公司名称 ID 等在以下列中重复 因为一家公司有多个属性 而不是一家公司只有一栏 在前几行
  • 如何创建一个语句来打印以特定单词开头的单词? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 python 中打印从特定字母开始的单词 而不使用函数 而是使用方法或循环 1 我有一个字符串 想要打印以 m 开头的单词 S
  • 使用 Python pandas 计算调整后的成本基础(股票买入/卖出的投资组合分析)

    我正在尝试对我的交易进行投资组合分析 并尝试计算调整后的成本基础价格 我几乎尝试了一切 但似乎没有任何效果 我能够计算调整后的数量 但无法获得调整后的购买价格有人可以帮忙吗 这是示例交易日志原始数据 import pandas as pd
  • 如何通过在 Python 3.x 上按键来启动和中断循环

    我有这段代码 当按下 P 键时会中断循环 但除非我按下非 P 键 否则循环不会工作 def main openGame while True purchase imageGrab if a sum gt 1200 fleaButton ti
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 按元组分隔符拆分列表

    我有清单 print L I WW am XX newbie YY ZZ You WW are XX cool YY ZZ 我想用分隔符将列表拆分为子列表 ZZ print new L I WW am XX newbie YY ZZ You
  • Seaborn Pairplot 图例不显示颜色

    我一直在学习如何在Python中使用seaborn和pairplot 这里的一切似乎都工作正常 但由于某种原因 图例不会显示相关的颜色 我无法找到解决方案 因此如果有人有任何建议 请告诉我 x sns pairplot stats2 hue
  • 如何在 phalcon 框架中同时连接多个数据库在模型类中同时使用两个而不仅仅是一个

    在我的代码中我有两个数据库ABC and XYZ 我想在同一模型中使用两个数据库 而不是 phalcon 中的解决方案是什么 如何为此实现多个数据库连接 one
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • 如何在 python 中没有 csv.reader 迭代器的情况下解析单行 csv 字符串?

    我有一个 CSV 文件 需要重新排列和重新编码 我想跑 line line decode windows 1250 encode utf 8 在由 CSV 读取器解析和分割之前的每一行 或者我想自己迭代行 运行重新编码 并仅使用单行解析表单
  • 使用 NumPy 将非均匀数据从文件读取到数组中

    假设我有一个如下所示的文本文件 33 346 1223 10 23 11 23 12 23 13 23 14 23 15 23 16 24 10 24 11 24 12 24 13 24 14 24 15 24 16 25 14 25 15
  • mac osx 10.8 上的初学者 python

    我正在学习编程 并且一直在使用 Ruby 和 ROR 但我觉得我更喜欢 Python 语言来学习编程 虽然我看到了 Ruby 和 Rails 的优点 但我觉得我需要一种更容易学习编程概念的语言 因此是 Python 但是 我似乎找不到适用于
  • 如何在 OSX 上安装 numpy 和 scipy?

    我是 Mac 新手 请耐心等待 我现在使用的是雪豹 10 6 4 我想安装numpy和scipy 所以我从他们的官方网站下载了python2 6 numpy和scipy dmg文件 但是 我在导入 numpy 时遇到问题 Library F
  • 如何为每个屏幕添加自己的 .py 和 .kv 文件?

    我想为每个屏幕都有一个单独的 py 和 kv 文件 应通过 main py main kv 中的 ScreenManager 选择屏幕 设计应从文件 screen X kv 加载 类等应从文件 screen X py 加载 Screens
  • phpActiveRecord 日期时间格式不正确

    当尝试使用 phpActiveRecord 在表中创建记录时 出现以下错误 Invalid datetime format 1292 Incorrect datetime value 2013 06 20 11 59 08 PDT for
  • 使用 PHP 将 latin1_swedish_ci 转换为 utf8

    我有一个数据库 里面充满了类似的值 Dhaka 应该是 Dhaka 因为我在创建数据库时没有指定排序规则 现在我想修复它 我无法从最初获取数据的地方再次获取数据 所以我在想是否可以在 php 脚本中获取数据并将其转换为正确的字符 我已将数据

随机推荐