在两个日期字段范围内过滤

时间:2018-01-28 00:35:15

标签: django django-filter

我有这样的事情:

 class Model(models.Model):
      start = models.DateTimeField()
      end = models.DateTimeField()

我希望得到符合以下限制条件的所有模型:

给出两个查询参数qstart,qend

  • model.end> QSTART
  • model.start< q.end

这将给出位于两个日期范围之间的所有Model对象。我看到你可以做到

 Model.objects.filter(date__range=[qstart, qend])

但是,它在单个字段上运行,因为我需要在2个单独的字段上操作。

4 个答案:

答案 0 :(得分:3)

改编自Django docs

过滤器()

过滤器(** kwargs)

返回一个包含与给定查找参数匹配的对象的新QuerySet。多个参数通过基础SQL语句中的AND连接。

在你的情况下:

Model.objects.filter(start__lte=qend, end__gte=qstart)

链接过滤器

优化QuerySet的结果本身就是一个QuerySet,因此可以将优化链接在一起。在您的情况下,例如:

Model.objects.filter(
     end__gte=qstart
).filter(
     start__lte=qend
)

这将获取数据库中所有条目的初始QuerySet,添加一个过滤器,然后添加另一个过滤器。最终结果是一个QuerySet,其中包含end> gt的所有条目。 qstart并开始< QEND。

Q对象

如果需要执行更复杂的查询(例如,带OR语句的查询),则可以使用Q对象。

Q()对象可以定义和重用条件。 Q对象可以使用&组合。和|运营商。当在两个Q对象上使用运算符时,它会产生一个新的Q对象。

在你的情况下:

from django.db.models import Q

Model.objects.get(
    Q(end__gte=qstart) & Q(start__lte=qend)
)

答案 1 :(得分:2)

只需添加其他条件:

Model.objects.filter(start__lte=qend, end__gte=qstart)

qendqstart必须为datetime.date objects

答案 2 :(得分:1)

简单地使用:

Model.objects.filter(end__gte=qstart).filter(start__lte=qend).all()

答案 3 :(得分:0)

import datetime
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))

参考:https://docs.djangoproject.com/en/3.0/ref/models/querysets/#range