Django 查询集最初保持为空,但在创建对象后填充,而无需重新运行查询。这怎么可能?

问题描述 投票:0回答:1

我在 Django 应用程序中遇到了一个令人困惑的问题。我在 DRF api 调用开始时从数据库查询中获取了一个查询集 (qs)。奇怪的是,这个查询集在检查时显示为空。然而,当我继续执行代码时,我为同一模型创建了一个对象,而无需重新运行查询集,令我惊讶的是,查询集突然填充了新创建的对象。

这是我所经历的简化版本:

# Initial queryset
initial_qs = MyModel.objects.filter(some_condition=True)

# At this point, initial_qs appears empty when I print it or inspect its contents

# Creating an object without re-running the queryset
new_object = MyModel.objects.create(some_field='value')

# Now, if I print initial_qs or inspect its contents again, it contains the newly created object

# How is it possible that the queryset remains empty initially but populates later without re-running the query?

Django 的 ORM 缓存机制或查询集评估的工作方式中是否有我忽略的东西?

python django orm django-orm
1个回答
0
投票

https://docs.djangoproject.com/en/5.0/ref/models/querysets/#when-querysets-are-evaluated

查询集是“惰性的”,即它不在此处执行

initial_qs = MyModel.objects.filter(some_condition=True)
,而是仅在您开始迭代查询集时执行。如果您在之后添加
print
,它将强制评估,但否则尚未评估。

© www.soinside.com 2019 - 2024. All rights reserved.