在Django Admin中按格式A搜索DateFields,尽管它们存储在格式B中

时间:2011-06-15 06:58:02

标签: django django-admin

正在构建一个Django应用程序。并且管理员需要能够根据可能还包括月份,年份等名称的查询来搜索项目。

问题(我似乎无法在SO或其他地方找到解决方案),是Django中日期的默认格式(好的,日期一直保存到数据存储区的方式)是%Y- %m-%d,但我希望能够从Django Admin搜索中搜索像“June”这样的查询。

如何使用自定义日期格式搜索日期字段,而无需转换日期保留的格式?

2 个答案:

答案 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