Day_5 · 面向对象(二):继承 —— 复刻 models.Model
上一天你写了 User 类,今天更进一步:继承。 Django 里 Article 没有写
__init__,没有写save(),却能.save()——为什么? 因为通用能力都在父类models.Model里,子类只需要写自己的字段。 今天我们自己写这个父类。
今日知识点 → 以后在 Django 里对应什么
| 今天练的 | 以后在 Django 里会看到 |
|---|---|
| 基类 + 子类继承 | 所有 Model 继承 models.Model |
方法重写 + super() |
自定义 Model 的 save() / delete() |
isinstance / issubclass |
判断对象类型、自定义 Manager |
题目(必做):继承 —— 复刻 models.Model
要求:
- 定义基类
BaseModel:- 类属性
objects = [](模拟数据库表) save(self):把self追加进objects,并打印[DB] 已保存 <类名>: <str(self)>delete(self):把self从objects中移除,打印[DB] 已删除 <str(self)>to_dict(self):把实例的所有属性转成字典(提示:self.__dict__是什么?)__str__(self):默认返回<类名#id>,比如<Article#1405...>
- 类属性
- 定义
Article(BaseModel):__init__接收title, content, author存成实例属性, 再用time模块记录created_at(形如2026-08-18 10:30:00) - 定义
Comment(BaseModel):__init__接收content, author - 全流程走一遍:创建文章和评论 → save → 遍历
BaseModel.objects打印 →to_dict()→ delete - 验证继承关系:
print(issubclass(Article, BaseModel))应为True,print(isinstance(a, BaseModel))应为True
进阶(思考 + 动手):如果要求"Article 保存前先打印一行日志",而 save() 写在父类里,
怎么办?(提示:在子类里重写 save(),先打印,再 super().save()。试试看输出顺序。)
出题意图:Django 的 Model 就是"通用逻辑放父类,子类只写自己的字段"。
理解了继承 + super(),你就理解了为什么 Django 模型"不写 save 却能保存"。
完成标准
- BaseModel + Article + Comment 全流程跑通(save / 遍历 / to_dict / delete)
- 继承验证两行输出均为
True(进阶则 +1:重写 save + super)
完成后打开 参考解答.py 对照。建议看完后关掉文件,自己再默写一遍。