如何在 Django 模型上将月份表示为字段

How to represent month as field on django model

特定日历月应如何表示为与整个月相关的数据字段,例如。 2015 年 3 月,而不是该月的特定日期。 Django 提供了 models.DateField class 但它需要指定日期。我要找的是 MonthField.

我正在寻找处理这种情况的最 pythonic 和 "Django" 方法。我现在已经多次遇到这种情况,很想知道 "right" 处理它的方法是什么。

我知道 this 问题。没有讨论基于字符串的方法的优缺点或与其他解决方案的比较。

我正在考虑的一些陈述包括:

  1. 使用日期字段并将日期强制为每月的 1 号。
  2. 使用单个整数,以 "months since January, 1900" 方式解释。
  3. 使用两个单独的整数字段,年和月。
  4. 使用字符字段,例如“2015-03”

我认为解决方案是使用自定义字段(根据 https://docs.djangoproject.com/en/dev/howto/custom-model-fields/models.Field 的子 class),使用上述表示之一,以及相关的小部件、验证等.但我也会考虑提供替代解决方案的答案。

一个类似的问题是与特定周相关的数据,例如。员工时间表。我过去通过创建 WorkWeek 模型来处理这个问题,尽管我怀疑这是错误的方法,因为我将数据存储在内置 python 库中已经可用的数据库中。

我建议您继续使用 Django 的 models.DateField,因为这将允许您保留在基于时间的系列上执行的日历查询,并且可能使您免于过度工程的潜在情况。

显示模型数据时,使用可用的 datetime 函数仅显示一年中的月份。在创作数据时,您可以简单地向用户展示一个自定义表单小部件,并将日期更新为表单验证时的当月 1 日。