筛选两个日期字段的范围

use*_*657 3 django django-filter

我有这样的事情:

 class Model(models.Model):
      start = models.DateTimeField()
      end = models.DateTimeField()
Run Code Online (Sandbox Code Playgroud)

我想得到所有遵循以下约束的模型:

给定两个查询参数qstart,qend

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

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

 Model.objects.filter(date__range=[qstart, qend])
Run Code Online (Sandbox Code Playgroud)

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

Kev*_* L. 5

改编自Django 文档

过滤()

过滤器(** kwargs)

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

在您的情况下:

Model.objects.filter(start__lte=qend, end__gte=qstart)
Run Code Online (Sandbox Code Playgroud)

链式过滤器

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

Model.objects.filter(
     end__gte=qstart
).filter(
     start__lte=qend
)
Run Code Online (Sandbox Code Playgroud)

这将获取数据库中所有条目的初始QuerySet,添加一个过滤器,然后添加另一个过滤器。最终结果是一个QuerySet,其中包含所有具有end> qstart和start <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)
)
Run Code Online (Sandbox Code Playgroud)

  • 如果您将其复制粘贴到您的答案中,您应该引用来源(在本例中为 [docs](https://docs.djangoproject.com/en/2.0/topics/db/queries/))。 (2认同)