django Multi-table inheritance ---- 用于实现基表-子表
Posted 蒋乐兴的技术随笔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django Multi-table inheritance ---- 用于实现基表-子表相关的知识,希望对你有一定的参考价值。
SQL中的父子表、在django中可以直接通过模式的继承来完成!
一、django中的model定义如下:
1、django定义
from django.db import models # Create your models here. class Person(models.Model): name=models.CharField(max_length=8) class Student(Person): sid=models.IntegerField() def sayHello(self): return "hello my name is {0}".format(self.name)
2、对应的sql实现
CREATE TABLE `ln_person` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(8) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `ln_student` ( `person_ptr_id` int(11) NOT NULL, `sid` int(11) NOT NULL, PRIMARY KEY (`person_ptr_id`), CONSTRAINT `ln_student_person_ptr_id_d756567d_fk_ln_person_id` FOREIGN KEY (`person_ptr_id`) REFERENCES `ln_person` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 可以看出student 并不是包涵person表中的列、而是维护了一个与person表之间 -- 外键关系
二、那么一张表可以同时继承自多张表吗?:
1、测试一个继承自多张表的mode
from django.db import models # Create your models here. class Person(models.Model): name=models.CharField(max_length=8) class Student(models.Model): sid=models.IntegerField() class Coder(Person,Student): pass
2、把变更迁移到mysql
JianglexingdeMacBook-Pro:learning jianglexing$ python3 manage.py makemigrations SystemCheckError: System check identified some issues: ERRORS: ln.Coder: (models.E005) The field ‘id‘ from parent model ‘ln.person‘ clashes with the field ‘id‘ from parent model ‘ln.student‘.
可以看出来这种写法是不行的、由于person 表与student 表都有id键、所以冲突了;不过由一中给出的例子,表之间的继承在SQL层面看来
也只不过是一个外键引用而已没什么别的、所以我们也可以通过两个外键引用的方式来完成。
----
以上是关于django Multi-table inheritance ---- 用于实现基表-子表的主要内容,如果未能解决你的问题,请参考以下文章
未处理的异常:在 _ScreenState.initState() 完成之前调用了 inheritFromWidgetOfExactType(_LocalizationsScope) 或 inheri