首页 > 解决方案 > 根据django中的子字符串过滤DateField

问题描述

所以我使用 aDateField来显示日期。当使用上下文传递给模板时,以格式呈现Nov. 4, 2018

现在数据库中有多个此类日期的条目。我想根据实际显示的日期字符串进行过滤。即,当我在搜索输入字段中输入Nov 4nov 4NOV 4,它应该显示匹配的结果。更像是子字符串匹配。

现在唯一的问题是我不知道如何将my_model.date字段转换为Nov. 4, 2018.

str(my_model.date)返回 2016-11-04,我不想用month_number-to-month_namemap解析它

我认为,这两种解决方案中的任何一种都应该有效。

1) 允许我这样做的 Django 过滤器。

2) 转换my_model.dateNov. 4, 2018字符串

请帮助,现在永远被困在这个问题上

标签: djangopython-3.x

解决方案


因为您特别提到在模板中呈现日期,所以我不确定您所指的搜索操作是前端、面向用户的事物还是后端数据库查询。

如果您想my_model.date在显示之前将其发送到模板之前转换为更漂亮的字符串,您可以在视图中处理它strptime- 这将为您提供str包装器缺少的控件:https://docs.python。 org/3/library/datetime.html#strftime-strptime-behavior虽然有模板标签也可以为您执行此操作,但在您的视图中执行此操作更快更好。

如果这是一个数据库查询,请记住您可以按日期对象的属性过滤它们。例如,要获取 2011 年 11 月 11 日创建的所有实例:

MyModel.objects.filter(
    date__day = 11, 
    date__month = 11,
    date__year = 2018
)

注意双下划线。


回复您的评论,现在我更好地理解了您的目标:

日期字段不会将其更“详细”的日期信息存储在可查询的位置。如果您希望能够查询诸如“Nov”之类的东西,而不是11那么您需要向模型添加另一个(或多个属性),以将该计算数据传播到可查询的容器中。

如果是我,我会这样做my_model

from datetime import date

...

rawDate = models.DateField(...) #your current date field
formatted_month = models.CharField(...)
formatted_day = models.IntegerField(...)
formatted_year = models.IntegerField(...)

...

def save(self):
    self.formatted_month = date.strftime(self.rawDate, '%b')
    self.formatted_day = date.strftime(self.rawDate, '%d')
    self.formatted_year = date.strftime(self.rawDate, '%Y')
    super().save()

现在您可以NOV/nov/Nov像这样执行查找:

MyModel.objects.filter(
    formatted_month__iexact = 'Nov'
)

这仍然需要您在访问数据库之前拆分搜索词中的月份和日期。如果您想稍微压缩一下,您可以将所有格式化的日期信息存储在一个字段中:

formatted_date = models.CharField(...)
...
def save(self):
    self.formatted_date = date.strftime(self.rawDate, '%b %d %Y')

然后,如果您的查询看起来像“NOV 4”,您可以这样做:

MyModel.objects.filter(formatted_date__icontains='NOV 4')

推荐阅读