gpt4 book ai didi

python - Django:是否可以在缓存的 QuerySet 上执行查询而不是查询数据库?

转载 作者:行者123 更新时间:2023-12-02 17:16:46 25 4
gpt4 key购买 nike

我经常需要缓存结果并执行类似 ORM 的操作,但使用 正常 Python 逻辑,因为我不希望数据库因性能问题而受到影响。

正是出于这个原因,我想知道 Django 是否提供了一种在缓存的 QuerySet 上执行 ORM 操作的方法,而不是每次执行 core 查询时都查询数据库使用略有变化。

为了形象化我在说什么,假设我们有这些不同的查询:

# when evaluated it hits the db
devs = Worker.objects.filter(job__category=JobCategory.DEVELOPER)

# when evaluated it hits the db again
young_devs_salary = devs.filter(dob__gte=datetime.now() - relativedelta(years=24)).values('dob', 'salary')

# it would hit the db again
wellpaid_devs = devs.filter(salary__gte=high_salary_yearly)

请注意,第一个 QuerySet 将是以下其余 QuerySet 的超集。

我所追求的是找出一种方法告诉 Django 只有第一个查询 devs 应该命中数据库,然后缓存其结果,而其他查询使用 devs,不应该查询数据库,而是查询缓存的 QuerySet

这可能吗?如果 Django 不支持这个,为什么?也许我的情况并不常见?但我有点怀疑,因为我每天都会遇到类似的情况。

最佳答案

正如 Daniel 已经回答的那样,不,您不能在最终访问数据库之前以这种方式使用查询 API。现在你不需要任何特殊的东西来过滤纯 python 中的查询集结果——这主要是使用标准 python 特性的标准列表过滤——但它实际上可能不会提高性能那么多,如果有的话。避免无用 db 命中很好,但这并不意味着数据库是您的敌人,并且在大多数情况下,具有合理模式的适当调整的数据库可能会胜过纯 python 列表过滤。

此外,FWIW 如果 Queryset API 确实支持纯 Python 过滤,它将作为标准列表过滤操作等实现,所以它会给你带来很多好处,恰恰相反。

举个例子——纯 python 版本:

young_devs_salary = devs.filter(dob__gte=datetime.now() - relativedelta(years=24)).values('dob', 'salary')

会是:

target_date = datetime.now() - relativedelta(years=24)
young_devs_salary = [(dev.dob, dev.salary) for dev in devs if dev.dob >= target_date]

如您所见,Queryset api 中不需要任何其他内容,但我怀疑这会比查询数据库快得多,除非您的数据集非常小或 django 应用程序与数据库之间的网络连接非常差服务器(或任何其他基础设施/数据库调整问题)。

关于python - Django:是否可以在缓存的 QuerySet 上执行查询而不是查询数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45980602/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com