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

最近在某个 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教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

membalas semua(3)
巴扎黑

_default_manager mewakili pengurus lalai Model Jika anda menentukan pengurus anda sendiri, pengurus pertama akan dianggap sebagai pengurus lalai.
Anda boleh merujuk kepada dokumentasi Djangohttps://docs.djangoproject.com/en/1.9/topics/db/managers/。

Pengurus lalai¶

Jika anda menggunakan objek Pengurus tersuai, ambil perhatian bahawa Pengurus pertama
Django bertemu (dalam susunan ia ditakrifkan dalam model)
mempunyai status istimewa Django mentafsir Pengurus pertama yang ditakrifkan dalam a
kelas sebagai Pengurus "lalai", dan beberapa bahagian Django (termasuk
dumpdata) akan menggunakan Pengurus tersebut secara eksklusif untuk model tersebut a
hasilnya, adalah idea yang baik untuk berhati-hati dalam memilih pengurus lalai
untuk mengelakkan situasi di mana mengatasi get_queryset()
mengakibatkan ketidakupayaan untuk mendapatkan semula objek yang ingin anda gunakan .

伊谢尔伦

Anda harus menyiarkan dua keping kod ini, self.get_comment_model() dan self.target_object bersama-sama, jika tidak, jawapan orang lain dengan meneka mungkin bukan jawapan yang anda inginkan

刘奇

Terima kasih, sebahagian daripada penyelesaian telah diselesaikan, .menggunakan(

        self.target_object._state.db
    ).filter
Bahagian

menunjukkan menggunakan jadual pangkalan data tempat sasaran_objek (contoh Model) terletak untuk pertanyaan, yang kebanyakannya memenuhi keperluan merentas tapak.

Terdapat juga perkara yang diwakili oleh _default_manager yang belum diselesaikan.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan