django 的svn 版本支持多继承了,继承有两种方式,一是将父类声明为abstract,这样每个具体的子类均有一个对应的表,父类是抽象类,不会为之建表
django 笔记-多继承from django.db import models
django 笔记-多继承
django 笔记-多继承
# Create your models here.
django 笔记-多继承
class Person(models.Model): 
django 笔记-多继承        name 
= models.CharField(max_length=10
django 笔记-多继承        height 
= models.SmallIntegerField() 
django 笔记-多继承    
class Meta:
django 笔记-多继承        abstract
=True
django 笔记-多继承  
django 笔记-多继承
django 笔记-多继承
class Man(Person): 
django 笔记-多继承        job 
= models.CharField(max_length=20
django 笔记-多继承
django 笔记-多继承
django 笔记-多继承
class Woman(Person): 
django 笔记-多继承        makeup 
= models.CharField(max_length=20
django 笔记-多继承
通过在Meta类中声明abstract=True,标识Person为抽象基类,这个类没有objects属性,也就是说没有Manager方法,无法进行单独的数据操作,所有的数据操作都要通过子类进行
生成的sql语句如下
django 笔记-多继承BEGIN;
django 笔记-多继承
CREATE TABLE `sample_woman` (
django 笔记-多继承    `id` 
integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
django 笔记-多继承    `name` 
varchar(10NOT NULL,
django 笔记-多继承    `height` 
smallint NOT NULL,
django 笔记-多继承    `makeup` 
varchar(20NOT NULL
django 笔记-多继承)
django 笔记-多继承;
django 笔记-多继承
CREATE TABLE `sample_man` (
django 笔记-多继承    `id` 
integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
django 笔记-多继承    `name` 
varchar(10NOT NULL,
django 笔记-多继承    `height` 
smallint NOT NULL,
django 笔记-多继承    `job` 
varchar(20NOT NULL
django 笔记-多继承)
django 笔记-多继承;
django 笔记-多继承
COMMIT;

第二种是基类一个表,每个子类的扩展属性另一个表,写法上没有什么特别要求
django 笔记-多继承from django.db import models
django 笔记-多继承
django 笔记-多继承
# Create your models here.
django 笔记-多继承
class Person(models.Model): 
django 笔记-多继承        name 
= models.CharField(max_length=10
django 笔记-多继承        height 
= models.SmallIntegerField() 
django 笔记-多继承
django 笔记-多继承
django 笔记-多继承
class Man(Person): 
django 笔记-多继承        job 
= models.CharField(max_length=20
django 笔记-多继承
django 笔记-多继承
django 笔记-多继承
class Woman(Person): 
django 笔记-多继承        makeup 
= models.CharField(max_length=20
django 笔记-多继承

生成的sql如下
django 笔记-多继承BEGIN;
django 笔记-多继承
CREATE TABLE `sample_person` (
django 笔记-多继承    `id` 
integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
django 笔记-多继承    `name` 
varchar(10NOT NULL,
django 笔记-多继承    `height` 
smallint NOT NULL
django 笔记-多继承)
django 笔记-多继承;
django 笔记-多继承
CREATE TABLE `sample_woman` (
django 笔记-多继承    `person_ptr_id` 
integer NOT NULL UNIQUE PRIMARY KEY,
django 笔记-多继承    `makeup` 
varchar(20NOT NULL
django 笔记-多继承)
django 笔记-多继承;
django 笔记-多继承
ALTER TABLE `sample_woman` ADD CONSTRAINT person_ptr_id_refs_id_4baa7c33 FOREIGN
django 笔记-多继承 
KEY (`person_ptr_id`) REFERENCES `sample_person` (`id`);
django 笔记-多继承
CREATE TABLE `sample_man` (
django 笔记-多继承    `person_ptr_id` 
integer NOT NULL UNIQUE PRIMARY KEY,
django 笔记-多继承    `job` 
varchar(20NOT NULL
django 笔记-多继承)
django 笔记-多继承;
django 笔记-多继承
ALTER TABLE `sample_man` ADD CONSTRAINT person_ptr_id_refs_id_78ed52db FOREIGN K
django 笔记-多继承EY (`person_ptr_id`) 
REFERENCES `sample_person` (`id`);
django 笔记-多继承
CREATE UNIQUE INDEX `sample_woman_person_ptr_id` ON `sample_woman` (`person_ptr_
django 笔记-多继承id`);
django 笔记-多继承
CREATE UNIQUE INDEX `sample_man_person_ptr_id` ON `sample_man` (`person_ptr_id`)
django 笔记-多继承;
django 笔记-多继承
COMMIT;

Person类可以进行数据查询操作,所以有必要识别返回的类是什么的问题,这里isinstance没用,django的处理是为Person添加子类的属性,以方便你通过这些属性访问具体的子类,在这里
results=Person.objects.all()
r=results[0]
这个r就有woman和man两个属性,下面的结论摘自我在邮件列表中的答复,备忘用

 

django 笔记-多继承这时,person_obj有 man和person两个属性 
django 笔记-多继承如果访问一个不是属于该类型的就会出现DoesNotExist 异常 
django 笔记-多继承实际中,不用通过捕获异常去判断,直接用 
django 笔记-多继承hasattr(person_obj,'man') 或 hasattr(person_obj,'woman') 就可以判断,返回True的就是 
django 笔记-多继承目标类型 
django 笔记-多继承
django 笔记-多继承(InteractiveConsole) 
django 笔记-多继承
django 笔记-多继承
django 笔记-多继承>>> from sample.models import * 
django 笔记-多继承>>> results=Person.objects.all() 
django 笔记-多继承>>> r=results[0] 
django 笔记-多继承>>> hasattr(r,'woman') 
django 笔记-多继承False 
django 笔记-多继承>>> hasattr(r,'man') 
django 笔记-多继承True 
django 笔记-多继承>>> r.man.job 
django 笔记-多继承u'computer' 
django 笔记-多继承>>> r.woman 
django 笔记-多继承
django 笔记-多继承
django 笔记-多继承Traceback (most recent call last): 
django 笔记-多继承  File "
<console>", line 1, in <module> 
django 笔记-多继承  File "C:\Python25\Lib\site-packages\django\db\models\fields 
django 笔记-多继承\related.py", line 
django 笔记-多继承178, in __get__ 
django 笔记-多继承    rel_obj = self.related.model._default_manager.get(**params) 
django 笔记-多继承  File "C:\Python25\Lib\site-packages\django\db\models\manager.py", 
django 笔记-多继承line 82, in 
django 笔记-多继承get 
django 笔记-多继承    return self.get_query_set().get(*args, **kwargs) 
django 笔记-多继承  File "C:\Python25\Lib\site-packages\django\db\models\query.py", line 
django 笔记-多继承197, in g 
django 笔记-多继承et 
django 笔记-多继承    % self.model._meta.object_name) 
django 笔记-多继承DoesNotExist: Woman matching query does not exist. 
django 笔记-多继承
django 笔记-多继承本来我跑的时候有个问题,好像访问了man属性,结果woman属性也有值了,不过其类型却是man,更新了svn版本,好像又正常了 
django 笔记-多继承
django 笔记-多继承

相关文章:

  • 2021-12-15
  • 2022-12-23
  • 2021-10-17
  • 2021-11-22
  • 2021-11-01
  • 2021-10-31
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-06
  • 2021-07-22
  • 2022-12-23
  • 2021-09-13
  • 2021-10-05
  • 2022-12-23
  • 2021-11-27
相关资源
相似解决方案