0

在我的应用程序中,我执行以下查找:

my_datapoint = Datapoint.objects.filter(timestamp_lte = desired_time).reverse()[0]

对于时间上不相邻的记录,我必须多次执行此操作。

有没有办法让这比拥有几个单独的查询集更有效?我可以把它们结合起来吗?

4

2 回答 2

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-带有-q-objects

文档中的示例

Poll.objects.get(
    Q(question__startswith='Who'),
    Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
)

这个例子说“有一个问题以'谁'开头的对象,以及具有这个发布日期或那个发布日期的对象”

于 2012-05-21T17:24:23.893 回答
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 的建议使用。

于 2012-05-21T17:43:12.277 回答