我在 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 缓存机制或查询集评估的工作方式中是否有我忽略的东西?
https://docs.djangoproject.com/en/5.0/ref/models/querysets/#when-querysets-are-evaluated
查询集是“惰性的”,即它不在此处执行
initial_qs = MyModel.objects.filter(some_condition=True)
,而是仅在您开始迭代查询集时执行。如果您在之后添加 print
,它将强制评估,但否则尚未评估。