Django ORM - 多表实例
封面图
•
2025-10-20
•
Django教程
0
0
0
0
在 Django 中,**多表实例(Multi-table inheritance)** 是一种模型继承方式,它允许你创建一个父类模型(base model),然后通过子类模型来扩展这个父类。Django 会为每个子类创建一个新的数据库表,并且自动添加一个指向父类的外键字段。 --- ## ✅ 多表继承的基本结构 ### 1. 父类(Base Model) ```python from django.db import models class Animal(models.Model): name = models.CharField(max_length=100) sound = models.CharField(max_length=100) def __str__(self): return self.name ``` ### 2. 子类(Child Model) ```python class Dog(Animal): breed = models.CharField(max_length=100) def __str__(self): return f"{self.name} ({self.breed})" ``` --- ## 🧠 Django 如何处理多表继承? - `Animal` 模型会在数据库中生成一张表。 - `Dog` 模型也会生成一张表,同时包含一个外键指向 `Animal` 表。 - 这个外键是 Django 自动创建的,名字通常是 `<model_name>_ptr`。 例如,`Dog` 的数据库表结构如下: | id | name | sound | breed | animal_ptr_id | |----|--------|-------|-----------|---------------| | 1 | Rex | Woof | Golden | 1 | > 注意:`animal_ptr_id` 是 Django 自动添加的,用来关联到 `Animal` 表中的记录。 --- ## 📌 查询示例 ### 1. 查询所有动物(包括子类) ```python animals = Animal.objects.all() for animal in animals: print(animal) # 如果是 Dog 实例,会调用 Dog 的 __str__ ``` ### 2. 查询特定类型的动物(Dog) ```python dogs = Dog.objects.all() for dog in dogs: print(dog.name, dog.breed) ``` ### 3. 获取父类实例 ```python dog = Dog.objects.get(name="Rex") animal = dog.animal_ptr # 获取对应的 Animal 实例 print(animal.sound) # 输出 "Woof" ``` --- ## ⚠️ 注意事项 - **性能问题**:由于多表继承需要额外的 JOIN 操作,因此在查询大量数据时可能会影响性能。 - **避免过度使用**:如果只是想扩展字段,可以考虑使用 `OneToOneField` 或者直接在模型中添加字段。 - **反向查询**:可以通过 `__subclasses__()` 获取所有子类,但不推荐用于复杂查询。 --- ## ✅ 总结 | 特性 | 多表继承(Multi-table Inheritance) | |---------------------|--------------------------------------| | 是否创建新表 | 是 | | 是否有外键 | 是(指向父类) | | 是否支持多继承 | 是(但建议谨慎使用) | | 查询效率 | 相对较低(JOIN 操作) | | 推荐场景 | 需要继承行为和字段,且不关心性能 | --- 如果你有具体的使用场景或遇到的问题,欢迎继续提问!
上一篇:
Django ORM - 单表实例
标题录入,一次不能超过6条
返回顶部
留言
留言
评论