【问题标题】:Django force using cache on querysetDjango 强制在查询集上使用缓存
【发布时间】:2020-07-30 21:54:46
【问题描述】:

我正在使用带有切片的 Django 查询集。我想评估一次,然后使用缓存的结果。

这是代码:

items_filtered = Item.objects.filter(......)
items_filtered_sliced = items_filtered[:100]
items_filtered_sliced_updated = Item.objects.filter(pk__in=items_filtered_sliced).update(....)

我需要稍后使用items_filtered_sliced查询集来过滤它,所以为了防止过滤切片查询集(这是不可能的)我想使用查询集第一个结果并尝试了这个-

items_filtered_sliced2 = Item.objects.filter(pk__in=items_filtered_sliced)

但似乎 items_filtered_sliced 再次被评估并返回下一个 100 而不是返回上一个结果。

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    您可以使用list(…) 来强制评估QuerySet。您甚至可以仅在 pk__in 中执行此操作,这仍将强制 items_filtered_sliced 进行评估:

    items_filtered = Item.objects.filter(…)
    items_filtered_sliced = items_filtered[:100]
    Item.objects.filter(pk__in=list(items_filtered_sliced)).update(…)
    for item in items_filtered_sliced:
        # do something
        print(item)

    这是可行的,因为迭代、计算长度等都会“消耗”QuerySet,而QuerySet 将在内部将记录存储在列表中。

    但是,如果您执行额外的过滤器等,这将使用缓存。因此,如果您使用for item in items_filtered_sliced<b>.all():</b>,它将再次对数据库进行新的查询。

    【讨论】:

    • 谢谢。关键是我需要将结果作为查询集,因为我需要稍后在需要查询集的函数中对其进行过滤。
    • @user2880391:那么你不能缓存它。由于 Django 不知道这些过滤器实际上是如何工作的。 .filter(..) 所做的只是将其转换为 SQL 查询。所以 Django 不知道如何处理带有过滤器的模型对象列表。注意item_filtered_slicedQuerySet,也在.update(..) 之后,但是如果你这样进一步过滤它,那么你就不能缓存它。
    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2014-10-26
    • 2017-05-21
    • 1970-01-01
    • 2015-03-04
    • 1970-01-01
    相关资源
    最近更新 更多