【问题标题】:Combining queries in django在 django 中组合查询
【发布时间】:2012-05-21 17:18:05
【问题描述】:

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

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

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

有没有办法比拥有多个单独的 QuerySet 更有效?我可以合并它们吗?

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    这已经被问了很多次了。你可以使用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))
    )
    

    此示例说明“问题以‘谁’开头的对象,以及具有此发布日期或该发布日期的对象”

    【讨论】:

    • 这会结合对数据库的实际调用吗?
    • @Goro:不,除非您实际形成单个查询对象或编写原始查询,否则您不能这样做。不幸的是,您不能采用完全独立的查询集并将它们组合成一个单独的数据库调用。可能需要进行大量检查才能将它们进行逻辑组合。
    【解决方案2】:

    “更高效”是指您希望避免多次命中数据库。那样的话,你应该查询一次,然后自己循环遍历,同样使用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

    【讨论】:

    • 是的,如果 OP 确实希望在一次通话中做到这一点,这将是替代建议。从服务器获取更多数据,并在客户端本地过滤。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-02
    • 2021-05-29
    • 2022-01-14
    • 2018-08-20
    • 2019-02-11
    • 2012-12-20
    相关资源
    最近更新 更多