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对象。我看到你可以做
Model.objects.filter(date__range=[qstart, qend])
Run Code Online (Sandbox Code Playgroud)
但是,它在单个字段上运行,因为我需要在2个单独的字段上运行。
改编自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)