Django继承

Django目前支持两种不同的继承方式,包括抽象基础类和多表继承。

1、抽象基础类:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

class Author(models.Model):

    name=models.CharField(max_length=20)

    

class Book(models.Model):

    title=models.CharField(max_length=100)

    num_pages=models.IntegerField()

    authors=models.ManyToManyField(Author)

    

    def __str__(self):

        return self.title

    

    class Meta(object):

        abstract=True

        

class SmithBook(Book):

    def __init__(self,*args,**kwargs):

        super(self,Book).__init__(*args,**kwargs)

        authors=models.ManyToManyField(Author,limit_choices_to={

                "name_endswith":"Smith"

        })

这里的关键是Meta嵌套类中的abstract=True,它指明了Book是一个基类。使用抽象基础类的方法,不会为基础类创建表。

在子类中的嵌套类Meta会继承或是和基类中的Meta合并起来。

attention:在SmithBook类中想要“重写”Book中的authors会出现错误,因为Django并不像python一样支持覆盖基类field的机制,但是我们可以通过在__init__方法中操作来达到同样的效果。

2、多表继承:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

class Author(models.Model):

    name=models.CharField(max_length=20)

    

class Book(models.Model):

    title=models.CharField(max_length=100)

    num_pages=models.IntegerField()

    authors=models.ManyToManyField(Author)

    

    def __str__(self):

        return self.title

        

class SmithBook(Book):

    def __init__(self,*args,**kwargs):

        super(self,Book).__init__(*args,**kwargs)

        authors=models.ManyToManyField(Author,limit_choices_to={

                "name_endswith":"Smith"

        })

多表继承和抽象基础类从表面上来看,只是在Meta嵌套类中没有了abstract=True,但是在底层是有比较大的区别的。

对于抽象基础类来说,Book是不能实例化的,而多表继承中的Book是可以实例化的。而且两者在数据库中创建的表也是不同的。

参考博客https://www.cnblogs.com/lazyzhong/p/3490646.html

时间: 2024-10-08 11:56:24

Django继承的相关文章

django继承修改 User表导致的问题

扩展默认的auth_user表参考: http://www.cnblogs.com/liwenzhou/p/9030211.html#undefined django继承修改 User表时,python  manage.py  makemigrations进行python  manage.py  migrate操作时会导致的问题如图: 根源:django文档中有注明: Due to limitations of Django’s dynamic dependency feature for sw

Django - 继承原生user表遇到的问题处理

Django - 继承原生user表遇到的问题处理] 1. 继承user表设置 # models.py文件 from django.contrib.auth.models import AbstractUser class User(AbstractUser): mobile = models.CharField(max_length=11) class Meta: db_table = 'new_user' verbose_name = '用户' verbose_name_plural = v

Django继承drf的user模型的demo

1.安装虚拟环境 #mkvirtualenv drfdemo -p python3 #pip install django #pip install djangorestframework #pip install pymysql 2.创建项目 django-admin startproject myuser 3.添加drf应用 在settings.py的INSTALLED_APPS中添加'rest_framework'. INSTALLED_APPS = [ ... 'rest_framewo

django - 继承 AbstractUser 明文 问题处理

问题现象 继承了 AbstractUser  之后的扩展用户表, 会出现在使用 admin 时密码明文显示的问题 变成明文有两个麻烦, 第一是不安全, 这个姑且不说, 其次就是不能享受django自带的一系列的加密解密的过程了 即使说在这时候你创建的密码会直接明文保存在数据库, 因此造成的问题就是  admin 是没法登陆使用的 解决方式 解决方式有很多目前了解的适用性最高的有两种 方式一 自行写相关方法实现加密解密的过程, 可以直接找别人写好的或者自己写都可以 方式二 注册使用 django

Django中CBV和Restful API中的APIView源码分析

Django中CBV和Restful API中的APIView源码分析 python的Django框架的视图处理可以用FBV, 也可以采用CBV.首先定义一个CBV视图: from django.views import Viewfrom django.http import JsonResponseclass Book(View):    def get(self, request):        ll = [{'key':value}]        return JsonResponse

django 模板的继承

django中模板继承操作: 模板继承 模板继承允许你建立一个基本的"骨架"模板, 它包含你所有最常用的站点元素 并 定义了一些可以被子模板覆盖的block. 这非常有用,例如各大门户网站左边一般有导航栏,在导航栏点击不同的区域时,只有中间<body>部分的内容更新了,而<body>标签之外的内容没有变.就像博客园一样 如何使用母模板和子模板? {% block title %}母模板的标题{% endblock %} {% block title %}子模板的

Django中的Model继承

Django 中的 model 继承和 Python 中的类继承非常相似,只不过你要选择具体的实现方式:让父 model 拥有独立的数据库:还是让父 model 只包含基本的公共信息,而这些信息只能由子 model 呈现. Django中有三种继承关系: 1.通常,你只是想用父 model 来保存那些你不想在子 model 中重复录入的信息.父类是不使用的也就是不生成单独的数据表,这种情况下使用抽象基类继承 Abstract base classes. 2.如果你想从现有的Model继承并让每个

第三百八十六节,Django+Xadmin打造上线标准的在线教育平台—HTML母版继承

第三百八十六节,Django+Xadmin打造上线标准的在线教育平台-HTML母版继承 母板-子板-母板继承 母板继承就是访问的页面继承一个母板,将访问页面的内容引入到母板里指定的地方,组合成一个新页面返回给浏览器 一般母板里都是写的一个网页里不变的地方,也就是通用的地方,被继承页(访问页)都是每个页面不同的地方,也就是将页面不同的地方引入到母板组合成一个新页面返回浏览器 母板里一般都是网页的.头部.底部.头部底部css.头部底部js 被继承页(访问页)里一般都是新内容,新内容的css和js 母

深入Django ORM的继承关系

ORM中通常将对象引用映射到外键,但是对于继承,关系数据库中没有自然有效的方法来对应.从数据存储的角度来看,在映射继承关系时,可以采用几种方式(参考JPA中的InheritanceType.定义): 使用单个表,在JPA中称作SINGLE_TABLE.整个继承树共用一张表.使用唯一的表,包含所有基类和子类的字段. 每个具体类一张表,在JPA中称作TABLE_PER_CLASS.这种方式下,每张表都包含具体类和继承树上所有父类的字段.因为多个表中有重复字段,从整个继承树上来说,字段是冗余的. 每个