如何在 Django 中按日期范围过滤查询对象?
我在一个模型中有一个字段,例如:
class Sample(models.Model):
date = fields.DateField(auto_now=False)
现在,我需要按日期范围过滤对象。
如何过滤日期在 1-Jan-2011
和 31-Jan-2011
之间的所有对象?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
请使用
如果您只是想过滤月份,
Or:编辑
正如 Bernhard Vallant 所说,如果您想要一个排除
指定范围结束
的查询集,您应该考虑他的解决方案,它利用gt/lt(大于/小于-比)。Use
Or if you are just trying to filter month wise:
Edit
As Bernhard Vallant said, if you want a queryset which excludes the
specified range ends
you should consider his solution, which utilizes gt/lt (greater-than/less-than).您可以使用 django 的
过滤器
与datetime.date
对象:You can use django's
filter
withdatetime.date
objects:使用过滤器执行 django 范围时,请确保您知道使用日期对象与日期时间对象之间的区别。 __range 包含日期,但如果您使用日期时间对象作为结束日期,并且未设置时间,则它将不包括当天的条目。
返回从开始日期到结束日期的所有条目,包括这些日期的条目。不好的例子,因为这是返回未来一周的条目,但你明白了。
将丢失 24 小时的条目,具体取决于日期字段的时间设置。
When doing django ranges with a filter make sure you know the difference between using a date object vs a datetime object. __range is inclusive on dates but if you use a datetime object for the end date it will not include the entries for that day if the time is not set.
returns all entries from startdate to enddate including entries on those dates. Bad example since this is returning entries a week into the future, but you get the drift.
will be missing 24 hours worth of entries depending on what the time for the date fields is set to.
您可以通过使用
DateTimeField/date
对象比较中缺乏精度来解决“阻抗不匹配”问题(如果使用范围,则可能会发生这种情况)。 strong>datetime.timedelta 在范围内的最后一个日期添加一天。其工作原理如下:如前所述,如果不执行此类操作,最后一天的记录将被忽略。
进行编辑以避免使用
datetime.combine
- 在与DateTimeField
进行比较时,坚持使用日期实例似乎更符合逻辑,而不是搞乱一次性(并且令人困惑)<代码>日期时间对象。请参阅下面评论中的进一步解释。You can get around the "impedance mismatch" caused by the lack of precision in the
DateTimeField/date
object comparison -- that can occur if using range -- by using a datetime.timedelta to add a day to last date in the range. This works like:As discussed previously, without doing something like this, records are ignored on the last day.
Edited to avoid the use of
datetime.combine
-- seems more logical to stick with date instances when comparing against aDateTimeField
, instead of messing about with throwaway (and confusing)datetime
objects. See further explanation in comments below.你可以使用“__range”
例如 :
you can use "__range"
for example :
为了使其更加灵活,您可以设计一个FilterBackend,如下所示:
To make it more flexible, you can design a FilterBackend as below:
很简单,
适合我
Is simple,
Works for me
模型
视图
Model
View