这是django支持的第二种继承方式,使用这种方式,因为每个类都是一个完整的model,而不属于抽象基类,所以每个model都有专属的数据表,都可以查询和创建数据表
这样的继承会默认自动创建一个OneToOneField关系
例:
from django.db import models
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(Place):
serves_hot_dogs = models.BooleanField(default=False)
serves_pizza = models.BooleanField(default=False)
Place里面的所有字段在 Restaurant中也是有效的,只不过没有保存在数据库中的Restaurant表中。所以下面两个语句都是可以运行的:
>>> Place.objects.filter(name="Bob's Cafe")
>>> Restaurant.objects.filter(name="Bob's Cafe")
如果你有一个 Place ,它同时也是一个 Restaurant, 那么你可以使用 model 的小写形式从 Place 对象中获得与其对应的 Restaurant对象:
>>> p = Place.objects.get(id=12)
# If p is a Restaurant object, this will give the child class:
>>> p.restaurant
<Restaurant: ...>
注意,如果 p 并不是 Restaurant (比如它仅仅只是 Place对象,或者它是其他类的父类),
那么在引用 p.restaurant就会抛出Restaurant.DoesNotExist 异常。
多表继承中的元类继承
子类并不能访问父类的Meta类,但是子类可以继承一部分父类的元类,如果子类没有指定 属性get_latest_by或 ordering 属性,它就会从父类中继承这些属性
如果父类有了排序设置,而你并不想让子类有任何排序设置,你就可以显式地禁用排序:
class ChildModel(ParentModel):
# ...
class Meta:
# Remove parent's ordering effect
ordering = []
指定链接父类的字段
Django 会自动创建一个OneToOneField字段将子类链接至非抽象的父 model 。如果你想指定链接父类的属性名称,你可以创建你自己的OneToOneField字段,并且设置parent_link=True从而使用该字段链接父类。
网友评论