首页 > 其他 > 详细

django Multi-table inheritance ---- 用于实现基表-子表

时间:2017-05-29 11:29:06      阅读:468      评论:0      收藏:0      [点我收藏+]

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 ---- 用于实现基表-子表

原文:http://www.cnblogs.com/JiangLe/p/6917578.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!