<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Sealyu

    --- 博客已遷移至: http://www.sealyu.com/blog

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      618 隨筆 :: 87 文章 :: 225 評論 :: 0 Trackbacks
    今天看到一篇關于介紹Django繼承機制的帖子,雖然簡單,但是還是記下來,以免忘記:
    django 的繼承有兩種方式:
    第一種:將父類聲明為abstract,這樣每個具體的子類均有一個對應的表,父類是抽象類,不會為之建表
    from django.db import models

    # Create your models here.
    class Person(models.Model): 
            name 
    = models.CharField(max_length=10
            height 
    = models.SmallIntegerField() 
        
    class Meta:
            abstract
    =True
      

    class Man(Person): 
            job 
    = models.CharField(max_length=20


    class Woman(Person): 
            makeup 
    = models.CharField(max_length=20
    通過在Meta類中聲明abstract=True,標識Person為抽象基類,這個類沒有objects屬性,也就是說沒有Manager方法,無法進行單獨的數據操作,所有的數據操作都要通過子類進行
    生成的sql語句如下
    BEGIN;
    CREATE TABLE `sample_woman` (
        `id` 
    integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
        `name` 
    varchar(10NOT NULL,
        `height` 
    smallint NOT NULL,
        `makeup` 
    varchar(20NOT NULL
    )
    ;
    CREATE TABLE `sample_man` (
        `id` 
    integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
        `name` 
    varchar(10NOT NULL,
        `height` 
    smallint NOT NULL,
        `job` 
    varchar(20NOT NULL
    )
    ;
    COMMIT;

    第二種:
    基類一個表,每個子類的擴展屬性另一個表,寫法上沒有什么特別要求
    from django.db import models

    # Create your models here.
    class Person(models.Model): 
            name 
    = models.CharField(max_length=10
            height 
    = models.SmallIntegerField() 


    class Man(Person): 
            job 
    = models.CharField(max_length=20


    class Woman(Person): 
            makeup 
    = models.CharField(max_length=20

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

    Person類可以進行數據查詢操作,所以有必要識別返回的類是什么的問題,這里isinstance沒用,django的處理是為Person添加子類的屬性,以方便你通過這些屬性訪問具體的子類,在這里
    results=Person.objects.all()
    r=results[0]
    這個r就有woman和man兩個屬性,下面的結論摘自我在郵件列表中的答復,備忘用

    這時,person_obj有 man和person兩個屬性 
    如果訪問一個不是屬于該類型的就會出現DoesNotExist 異常 
    實際中,不用通過捕獲異常去判斷,直接用 
    hasattr(person_obj,'man') 或 hasattr(person_obj,'woman') 就可以判斷,返回True的就是 
    目標類型 

    (InteractiveConsole) 


    >>> from sample.models import * 
    >>> results=Person.objects.all() 
    >>> r=results[0] 
    >>> hasattr(r,'woman') 
    False 
    >>> hasattr(r,'man') 
    True 
    >>> r.man.job 
    u'computer' 
    >>> r.woman 


    Traceback (most recent call last): 
      File "
    <console>", line 1, in <module> 
      File "C:"Python25"Lib"site-packages"django"db"models"fields 
    "related.py", line 
    178, in __get__ 
        rel_obj = self.related.model._default_manager.get(**params) 
      File "C:"Python25"Lib"site-packages"django"db"models"manager.py", 
    line 82, in 
    get 
        return self.get_query_set().get(*args, **kwargs) 
      File "C:"Python25"Lib"site-packages"django"db"models"query.py", line 
    197, in g 
    et 
        % self.model._meta.object_name) 
    DoesNotExist: Woman matching query does not exist. 




    posted on 2008-10-28 22:42 seal 閱讀(2225) 評論(0)  編輯  收藏 所屬分類: Python
    主站蜘蛛池模板: 狠狠躁狠狠爱免费视频无码| 老司机亚洲精品影院在线观看| 中文字幕在线观看免费| 亚洲AV无码乱码精品国产| 黄网站在线播放视频免费观看| 免费国产人做人视频在线观看| 黄页网站在线视频免费| 亚洲午夜福利精品无码| a毛看片免费观看视频| 精品亚洲综合在线第一区| 人妻在线日韩免费视频| 国产亚洲精品国看不卡| 免费一级不卡毛片| 亚洲成人午夜在线| 91久久精品国产免费直播| youjizz亚洲| 亚洲国产精品人人做人人爽 | 亚洲国产品综合人成综合网站| 7723日本高清完整版免费| 亚洲熟妇成人精品一区| 免费jjzz在在线播放国产| 久久九九久精品国产免费直播| 亚洲产国偷V产偷V自拍色戒| 2019中文字幕免费电影在线播放| 亚洲av永久无码嘿嘿嘿| 免费国产成人午夜私人影视| 精品免费视在线观看| 亚洲精品国产日韩| 久久综合亚洲色HEZYO国产| 久久99精品免费视频| 亚洲中文字幕一二三四区| 亚洲国产av无码精品| 无码人妻AV免费一区二区三区| 亚洲H在线播放在线观看H| 亚洲 另类 无码 在线| 99精品视频在线视频免费观看| 亚洲熟妇AV一区二区三区宅男| 亚洲中久无码永久在线观看同| 色片在线免费观看| 日韩在线一区二区三区免费视频| 久久久久亚洲AV片无码|