Files
DailyChallenge_ProgrammingD…/Day_5

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

要求:

  1. 定义基类 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...>
  2. 定义 Article(BaseModel):__init__ 接收 title, content, author 存成实例属性, 再用 time 模块记录 created_at(形如 2026-08-18 10:30:00)
  3. 定义 Comment(BaseModel):__init__ 接收 content, author
  4. 全流程走一遍:创建文章和评论 → save → 遍历 BaseModel.objects 打印 → to_dict() → delete
  5. 验证继承关系: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 对照。建议看完后关掉文件,自己再默写一遍。