python - Django 的 _default_manager 指的是什么?
高洛峰
高洛峰 2017-04-17 17:56:07
0
3
572

最近在某个 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 相关的源码,云里雾里的,求大家指点!

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(3)
巴扎黑

_default_manager는 모델의 기본 관리자를 나타냅니다. 자체 관리자를 정의하면 첫 번째 관리자가 기본 관리자로 간주됩니다.
Django 문서 https://docs.djangoproject.com/en/1.9/topics/db/managers/를 참고하실 수 있습니다.

기본 관리자¶

사용자 정의 Manager 개체를 사용하는 경우
Django에서 발생하는 첫 번째 Manager(모델에 정의된 순서대로)
Django에서는 정의된 첫 번째 Manager를 해석합니다.
클래스를 "기본" Manager로 지정하고 Django의 여러 부분(
dumpdata 포함)은 해당 모델에만 해당 Manager를 사용하므로
선택에 주의하는 것이 좋습니다. get_queryset()
을 재정의하면 작업하려는 개체를 검색할 수 없는 상황을 피하기 위해
기본 관리자를 사용합니다.

伊谢尔伦

self.get_comment_model()과 self.target_object라는 두 코드를 함께 게시해야 합니다. 그렇지 않으면 다른 사람의 추측에 의한 답변이 원하는 답변이 아닐 수도 있습니다

刘奇

감사합니다. .using(

을 사용하여 솔루션의 일부가 해결되었습니다. 으아아아

부분은 주로 사이트 간 요구 사항을 충족하기 위해 target_object(모델 인스턴스)가 있는 데이터베이스의 테이블을 쿼리에 사용함을 나타냅니다.

해결되지 않은 _default_manager가 나타내는 내용도 있습니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿