【发布时间】:2012-05-21 17:18:05
【问题描述】:
在我的应用程序中,我执行以下查找:
my_datapoint = Datapoint.objects.filter(timestamp_lte = desired_time).reverse()[0]
对于时间上不相邻的记录,我必须多次执行此操作。
有没有办法比拥有多个单独的 QuerySet 更有效?我可以合并它们吗?
【问题讨论】:
标签: python django django-queryset
在我的应用程序中,我执行以下查找:
my_datapoint = Datapoint.objects.filter(timestamp_lte = desired_time).reverse()[0]
对于时间上不相邻的记录,我必须多次执行此操作。
有没有办法比拥有多个单独的 QuerySet 更有效?我可以合并它们吗?
【问题讨论】:
标签: python django django-queryset
这已经被问了很多次了。你可以使用chain
from itertools import chain
combined = chain(qs1, qs2, ...)
for item in combined:
# foo
完全分离查询集对象的另一种方法是查看您是否可以使用 Q 对象通过“OR”查询来做到这一点:
https://docs.djangoproject.com/en/1.4/topics/db/queries/#complex-lookups-with-q-objects
文档中的示例
Poll.objects.get(
Q(question__startswith='Who'),
Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)
此示例说明“问题以‘谁’开头的对象,以及具有此发布日期或该发布日期的对象”
【讨论】:
“更高效”是指您希望避免多次命中数据库。那样的话,你应该查询一次,然后自己循环遍历,同样使用QuerySet进行排序比reverse()
my_datapoint = Datapoint.objects.filter(timestamp_lte = max_desired_time).order_by('-timestamp')
def getLatest(desired_time):
for item in my_datapoint:
if item.timestamp <= desired_time:
return item
如果您只想要更简单的语法,请按照 jdi 的建议使用 chain。
【讨论】: