我有这样的事情:
class Model(models.Model):
start = models.DateTimeField()
end = models.DateTimeField()
我希望得到符合以下限制条件的所有模型:
给出两个查询参数qstart,qend
这将给出位于两个日期范围之间的所有Model对象。我看到你可以做到
Model.objects.filter(date__range=[qstart, qend])
但是,它在单个字段上运行,因为我需要在2个单独的字段上操作。
答案 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)
qend
,qstart
必须为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