Django如何为模型类添加objects属性?是继承还是动态添加?
Django模型的
objects Manager是怎么来的? 嘿,这个问题问到点子上了!很多人会误以为objects是从models.Model直接继承来的,但其实真相是Django通过元类动态给模型类添加的,具体细节我给你拆解下:
- 首先,
models.Model本身并没有定义objects这个属性——你去翻Django的源码就能看到,Model类里压根没这个字段。 - 真正起作用的是Django的模型元类
ModelBase。当你定义一个继承自models.Model的类时,ModelBase的__new__方法会在这个类被创建的过程中做一系列处理,其中就包括检查你的模型类是否已经有了自定义的Manager实例(比如你自己写了custom_manager = models.Manager())。 - 如果你的模型类里没有任何自定义的Manager,元类就会自动给这个类添加一个名为
objects的models.Manager()实例,这就是你平时用Model.objects.all()的由来。 - 当然,如果你自己显式定义了Manager,Django就不会再自动添加
objects了——除非你特意写上objects = models.Manager()。举个例子:
from django.db import models # 这个模型会被自动添加objects Manager class Book(models.Model): title = models.CharField(max_length=200) # 这个模型只有my_manager,不会有默认的objects,除非你手动加 class Author(models.Model): name = models.CharField(max_length=100) my_manager = models.Manager()
另外补充一点:如果你的模型继承了另一个已经有objects的父模型,子类会继承这个objects——但这只是继承的常规行为,默认情况下的objects还是元类动态生成的,不是从最顶层的models.Model来的。
内容的提问来源于stack exchange,提问作者mcv
相关产品推荐
相关产品推荐

