为什么对于带注释的字段,获取和过滤的工作方式不同?

时间:2019-08-19 15:51:38

标签: django django-models

我在自定义管理器中有一个用于重命名字段的模型的get_queryset:

class Manager:
    def get_queryset(self):
        return super(Manager, self).get_queryset().values(renamed_field=F('original_field'))

为什么我可以在重命名的字段上执行.filter,但是当我执行.get时,我需要使用原始字段名称?

这有效:

Model.objects.filter(renamed_field='Test')

但是不存在与匹配查询有关的错误:

Model.objects.get(renamed_field='Test')

1 个答案:

答案 0 :(得分:1)

来自docs关于查询集:

  

在内部,可以构造,过滤,切片和查询集   通常在没有实际访问数据库的情况下通过。没有   实际上会发生数据库活动,直到您进行评估   查询集。

调用get方法时,您会命中数据库。这说明了为什么会收到有关没有匹配查询的错误的信息。