1. 程式人生 > >django Multi-table inheritance ---- 用於實現基表-子表

django Multi-table inheritance ---- 用於實現基表-子表

django 而是 col pro ror person err per 兩個

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 ---- 用於實現基表-子表