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

最近在某个 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 オブジェクトを使用する場合は、最初の Manager
Django が (モデルで定義されている順序で)
で定義された最初の Manager を解釈することに注意してください。
クラスを「デフォルト」マネージャーとして使用し、Django のいくつかの部分 (
dumpdata を含む) がそのモデル専用にそのマネージャーを使用することになります。
結果として、選択には注意することをお勧めします。 get_queryset()
をオーバーライドすると、操作したいオブジェクトを取得できなくなるという状況を避けるため
のデフォルト

マネージャ。
いいねを押す +0
伊谢尔伦

これら 2 つのコード、self.get_comment_model() と self.target_object を一緒に投稿する必要があります。そうしないと、推測による他の人の回答があなたが望む回答ではない可能性があります

いいねを押す +0
刘奇

ありがとうございます。解決策の一部は解決されました。.using(

リーリー

の部分は、主にクロスサイトのニーズを満たすために、target_object (モデル インスタンス) が配置されているデータベースのテーブルをクエリに使用することを示します。

_default_manager が表す未解決のものもあります。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート