python - Django 的 _default_manager 指的是什么?

查看:263
本文介绍了python - Django 的 _default_manager 指的是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

最近在某个 Django 的 app 中看到这样的一段代码:

possible_duplicates = self.get_comment_model()._default_manager.using(
            self.target_object._state.db
        ).filter(
            content_type=new.content_type,
            object_pk=new.object_pk,
            user_name=new.user_name,
            user_email=new.user_email,
            user_url=new.user_url,
        )

其中有几个用法不知道其作用:

  1. 首先我们得到了一个 Model 类,其 _default_manager 是什么?从其后面的方法来看应该是一个 Manager 的实例,但是这个 manager 指的是什么?如果我在 model 中自定义了一个 manager,比如 objects = MyManager(),那么这个 _default_manager 指向的是这个自定义的 manager 还是 django 默认的 Manager()?

  2. _state.db 指的是什么?一个 model 实例的 _state 是什么? .db 又是什么?有什么作用?

  3. 为什么要这么写,有什么好处?不能直接写成 self.get_comment_model().objects.filter()么?

看了看 model 相关的源码,云里雾里的,求大家指点!

解决方案

_default_manager代表Model的默认管理器,如果定义自己的管理器,第一个管理器会认为是默认管理器。
可以参考Django的文档https://docs.djangoproject.com/en/1.9/topics/db/managers/

Default managers¶

If you use custom Manager objects, take note that the first Manager
Django encounters (in the order in which they’re defined in the model)
has a special status. Django interprets the first Manager defined in a
class as the default Manager, and several parts of Django (including
dumpdata) will use that Manager exclusively for that model. As a
result, it’s a good idea to be careful in your choice of default
manager in order to avoid a situation where overriding get_queryset()
results in an inability to retrieve objects you’d like to work with.

这篇关于python - Django 的 _default_manager 指的是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆