在django中组合查询

时间:2012-05-21 17:18:06

标签: python django django-queryset

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

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

对于时间不相邻的记录,我必须多次这样做。

有没有办法让它比拥有几个单独的QuerySet更有效?我可以将它们结合起来吗?

2 个答案:

答案 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建议。