在我的应用程序中,我执行以下查找:
my_datapoint = Datapoint.objects.filter(timestamp_lte = desired_time).reverse()[0]
对于时间不相邻的记录,我必须多次这样做。
有没有办法让它比拥有几个单独的QuerySet更有效?我可以将它们结合起来吗?
答案 0 :(得分:4)
这里有很多次问过这个问题。您可以使用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))
)
此示例显示“以'Who'开头的问题的对象,AND,具有此发布日期或发布日期的对象”
答案 1 :(得分:1)
通过“更高效”,我认为你的意思是你想多次避免命中数据库。在这种情况下,你应该查询一次,然后自己循环遍历它,也使用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
如果您只想要更简单的语法,请使用chain
作为jdi建议。