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

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

répondre à tous(3)
巴扎黑

_default_manager représente le manager par défaut du Modèle. Si vous définissez votre propre manager, le premier manager sera considéré comme le manager par défaut.
Vous pouvez vous référer à la documentation de Djangohttps://docs.djangoproject.com/en/1.9/topics/db/managers/。

Gestionnaires par défaut¶

Si vous utilisez des objets Manager personnalisés, notez que les premières rencontres Manager
Django (dans l'ordre dans lequel elles sont définies dans le modèle)
ont un statut spécial Django interprète le premier Manager défini dans. une
classe comme Manager « par défaut », et plusieurs parties de Django (y compris
dumpdata) utiliseront ce Manager exclusivement pour ce modèle As. un
résultat, c'est une bonne idée d'être prudent dans votre choix de
gestionnaire par défaut afin d'éviter une situation où la substitution de get_queryset()
entraîne une incapacité à récupérer les objets avec lesquels vous aimeriez travailler .

伊谢尔伦

Vous devez publier ces deux morceaux de code, self.get_comment_model() et self.target_object ensemble, sinon les réponses des autres en devinant pourraient ne pas être la réponse que vous souhaitez

刘奇

Merci, une partie de la solution est résolue, .using(

        self.target_object._state.db
    ).filter
La partie

indique l'utilisation de la table de la base de données où se trouve l'objet_cible (instance de modèle) pour les requêtes, ce qui répond principalement aux besoins cross-site.

Il y a aussi ce que _default_manager représente qui n'a pas été résolu.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal