You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:34:20