正在构建一个Django应用程序。并且管理员需要能够根据可能还包括月份,年份等名称的查询来搜索项目。
问题(我似乎无法在SO或其他地方找到解决方案),是Django中日期的默认格式(好的,日期一直保存到数据存储区的方式)是%Y- %m-%d,但我希望能够从Django Admin搜索中搜索像“June”这样的查询。
如何使用自定义日期格式搜索日期字段,而无需转换日期保留的格式?
答案 0 :(得分:0)
日期和时间作为它们的不同类型存储在数据库中,因为您应该能够执行特殊的日期时间操作,例如大于,小于而不仅仅是字符串搜索。
Django ORM接受日期时间作为以一种标准格式(包括字符串,整数和datetime
对象)格式化的字符串。
示例:
Entry.objects.filter(pub_date__year=2006)
或
Entry.objects.filter(
... headline__startswith='What'
... ).exclude(
... pub_date__gte=datetime.now()
... ).filter(
... pub_date__gte=datetime(2005, 1, 1)
... )
您可以使用多个库中的任何一个来将字符串中的时间解析为datetime
对象。最简单的方法是使用令人敬畏的dateutil
库:
import dateutil.parser
dateutil.parser.parse('2008-08-09T18:39:22Z')
#Following is returned
datetime.datetime(2008, 8, 9, 18, 39, 22, tzinfo=tzutc())
答案 1 :(得分:0)
你可能已经找到了答案,但它对某些人(比如我自己!)仍然很有用。
Django 1.6 + : 您可以自定义搜索结果: https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_search_results
之前的Django版本: 您只需使用自己的ChangeList临时更改查询字符串中的日期格式。请注意,格式只是暂时更改,以便用户不会在查询字符串中看到任何更改。
下面的示例接受英国日期格式,例如'1999年12月31日'但它可以很容易地改变为接受任何日期格式(或者只是像@nemesisfixx所要求的'6月'这样的月份名称)
在您的管理模型中,自定义更改列表类:
class MyModelAdmin(admin.ModelAdmin):
...
def get_changelist(self, request, **kwargs):
"""
Returns the ChangeList class for use on the changelist page.
"""
return MyChangeList
然后在MyChangeList类中:
class MyChangeList(ChangeList):
def get_query_set(self, request):
# Allow date search with UK format
try:
date_search = datetime.datetime.strptime(self.query, '%d %b %Y').date().strftime('%Y-%m-%d')
except ValueError:
date_search = self.query
with temporary_value(self, 'query', date_search):
qs = super(MyChangeList, self).get_query_set(request)
return qs