尽管它们以B格式存储,但仍在Django Admin中按A格式搜索DateField

问题描述

|| 正在构建Django应用。并且要求管理员能够基于查询搜索项目,其中查询可能还包括月份,年份等的名称。 问题(我似乎无法在SO上或其他地方找到解决方案)是Django中日期的认格式(好了,日期被保存到数据存储区的方式)是%Y-%m -%d,但我希望能够从Django Admin搜索搜索诸如\“ June \”之类的查询。 如何使使用自定义日期格式的日期字段搜索成为可能,而无需转换保留日期的格式?     

解决方法

        日期和时间作为它们的独特类型存储在数据库中,因为您应该能够执行特殊的日期时间操作,例如大于,小于和不仅仅是字符串搜索。 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)
... )
您可以使用多个库中的任何一个将字符串中的时间解析为“ 0”  对象。最简单的方法是使用很棒的
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())
    ,        您可能已经找到了答案,但对仍在研究此问题的某人(例如我自己!)可能有用。 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要求的\\ June \等月份名称) 在您的管理模型中,自定义变更列表类:
  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
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...