【问题标题】:How to apply __contains to formatted date with django ORM?如何使用 django ORM 将 __contains 应用于格式化日期?
【发布时间】:2020-07-10 18:11:45
【问题描述】:

我想实现一个数据库搜索,我需要按包含搜索请求的日期过滤查询集。问题是用户将看到格式化的日期(如 dd.mm.yyyy),并希望搜索以相同的方式看到它,但默认 __contains 考虑采用 yyyy-mm-dd 格式的日期。如何在使用__contains 之前将过滤器应用于 DateField?我需要一种使用 django orm 的方法,否则它会太长(不使用 sql)。

我尝试将DATE_FORMAT = 'd.m.Y' 设置为令人满意的格式,但它没有效果(即使设置USE_L10N = False

也考虑过创建自定义查找但不知道如何实现它

我需要将__contains 应用于所有模型字段,所以我不能只重新格式化搜索值

【问题讨论】:

  • 您可以将字符串转换为日期时间对象并使用它进行过滤

标签: python sql django django-models django-orm


【解决方案1】:

您可以将日期属性注释为CharField 并在注释属性上执行过滤器。

from django.db.models import Func, F, Value, CharField 
queryset.annotate(string_date=Func(
                                   F('YOUR_DATE_FIELD'),
                                   Value('YOUR OUTPUT FORMAT'),
                                   output_field=CharField(),
                                   function='to_char')
                  ).filter(string_date__contains=INPUT_DATE)

【讨论】:

  • 我需要用 django orm 格式化才能在queryset.filter() 表达式中使用
  • filter(date_attr__contains=datetime.datetime.strptime('01.01.2020', "%d.%m.%Y").strftime("%Y-%m-%d")) 工作正常
  • 我不能这样做,因为搜索值可能像“01”。我仍然必须返回 01.01.2020 日期的实例
  • 对不起,我把你们都弄错了,我编辑了我的答案,希望这能有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2013-08-11
  • 2021-01-11
  • 2021-05-14
  • 1970-01-01
  • 1970-01-01
  • 2020-12-17
相关资源
最近更新 更多