django - 根据django中的子字符串过滤DateField
问题描述
所以我使用 aDateField
来显示日期。当使用上下文传递给模板时,以格式呈现Nov. 4, 2018
现在数据库中有多个此类日期的条目。我想根据实际显示的日期字符串进行过滤。即,当我在搜索输入字段中输入Nov 4
或nov 4
时NOV 4
,它应该显示匹配的结果。更像是子字符串匹配。
现在唯一的问题是我不知道如何将my_model.date
字段转换为Nov. 4, 2018
.
str(my_model.date)
返回 2016-11-04,我不想用month_number-to-month_name
map解析它
我认为,这两种解决方案中的任何一种都应该有效。
1) 允许我这样做的 Django 过滤器。
2) 转换my_model.date
成Nov. 4, 2018
字符串
请帮助,现在永远被困在这个问题上
解决方案
因为您特别提到在模板中呈现日期,所以我不确定您所指的搜索操作是前端、面向用户的事物还是后端数据库查询。
如果您想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')