美文网首页django
模型继承之多表继承

模型继承之多表继承

作者: 陆_志东 | 来源:发表于2018-08-23 23:34 被阅读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从而使用该字段链接父类。

相关文章

  • 模型继承之多表继承

    这是django支持的第二种继承方式,使用这种方式,因为每个类都是一个完整的model,而不属于抽象基类,所以每个...

  • 模型继承之多表继承2之代理继承

    在多表继承文章中,已经讲过,多表继承都是完整的model,都会创建数据库表,那么可以不可以像抽象基类那样不让继承的...

  • 模型继承

    django中的继承有三类; 1.抽象继承 2.多表继承 3.proxy model(代理模型) 第一种情况 第1...

  • JSon-Model

    字典转模型框架 Mantle所有模型都必须继承自MTModel JSONModel所有模型都必须继承自JSONMo...

  • C++笔记五(面向对象编程下)

    十六 对象模型:关于vptr和vtbl 如图模型所示,B类继承A类,C类继承B类,子类有父类的成分,继承的包括数据...

  • Odoo10开发教程四(继承和Domain)

    继承 模型继承 Odoo提供两种继承机制,以模块化方式扩展现有模型。第一种继承机制允许一个模块修改另一个模块中定义...

  • 慕课网-C++远征之继承篇(下)-学习笔记

    C++远征之继承篇(下) 多继承与多重继承 多重继承: 多继承: 如果不写,那么系统默认为private继承 多重...

  • 可继承的CSS样式属性

    不可继承:边框,盒子模型,背景属性 可继承:字体,文本样式属性 不可继承的:display、margin、bord...

  • 继承之组合继承

    组合原型链和借用构造函数 设计思想:1.使用原型链实现对原型属性和方法的继承:Man3.prototype = n...

  • Django之抽象基类

    Django中所有的模型都必须继承django.db.models.Model模型,不管是直接继承也好,还是间接继...

网友评论

    本文标题:模型继承之多表继承

    本文链接:https://www.haomeiwen.com/subject/xsjviftx.html