django

模型继承之多表继承

2018-08-23  本文已影响16人  陆_志东

这是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从而使用该字段链接父类。

上一篇下一篇

猜你喜欢

热点阅读