django框架面向?qū)ο驩RM模型繼承用法實(shí)例分析
本文實(shí)例講述了django框架面向?qū)ο驩RM模型繼承用法。分享給大家供大家參考,具體如下:
Django ORM對(duì)模型繼承的支持,將python面向?qū)ο蟮木幊谭椒ㄅc數(shù)據(jù)庫(kù)面向關(guān)系表的數(shù)據(jù)結(jié)構(gòu)結(jié)合的很巧妙。支持三種風(fēng)格的模型繼承。
1.抽象類(lèi)繼承:父類(lèi)繼承自models.Model,但不會(huì)在底層數(shù)據(jù)庫(kù)中生成相應(yīng)的數(shù)據(jù)表,父類(lèi)的屬性列存儲(chǔ)在其子類(lèi)的數(shù)據(jù)表中。
2.多表繼承:多表繼承的每個(gè)模型類(lèi)都在底層數(shù)據(jù)庫(kù)中生成相應(yīng)的數(shù)據(jù)表管理數(shù)據(jù)。
3.代理模型繼承:父類(lèi)用于在底層數(shù)據(jù)庫(kù)中管理數(shù)據(jù)表,而子類(lèi)不定義數(shù)據(jù)列,只定義查詢數(shù)據(jù)表的排序方式等元數(shù)據(jù)。
1.抽象基類(lèi)繼承舉例如下:
from django.db import models class Message(models.Model): id = models.AutoField(default=0) content = models.CharField(max_length=100) user_name = models.CharField(max_length=80) pub_date = models.DateField() class Meta: abstract = True #證明該類(lèi)是抽象基類(lèi) class Moment(Message): headline = models.CharField(max_length=50) LEVELS = ( ('1', 'Very Good'), ('2', 'Good'), ('3', 'Normal'), ('4', 'Bad'), ) class Coment(Message): level = models.CharField(max_length=50, choices=LEVELS, default=LEVELS[3])
抽象基類(lèi)Message,用于保存消息的四個(gè)字段:id、content、user_name和pub_date。子類(lèi)Moment和Coment分別繼承Message,并且分別定義獨(dú)有的一個(gè)地段。三個(gè)類(lèi)映射到數(shù)據(jù)庫(kù),會(huì)被定義為兩個(gè)數(shù)據(jù)表(抽象基類(lèi)不在底層數(shù)據(jù)庫(kù)中聲稱數(shù)據(jù)表):
數(shù)據(jù)表:app_Moment:app代表應(yīng)用,包括id、user_name、content、pub_date和headline五個(gè)字段
數(shù)據(jù)表:app_Coment: 包括包括id、user_name、content、pub_date和level五個(gè)字段
2.多表繼承
from django.db import models class Message(models.Model): id = models.AutoField(default=0) content = models.CharField(max_length=100) user_name = models.CharField(max_length=80) pub_date = models.DateField() class Moment(Message): headline = models.CharField(max_length=50) LEVELS = ( ('1', 'Very Good'), ('2', 'Good'), ('3', 'Normal'), ('4', 'Bad'), ) class Coment(Message): level = models.CharField(max_length=50, choices=LEVELS, default=LEVELS[3])
類(lèi)Message,用于保存消息的四個(gè)字段:id、content、user_name和pub_date。子類(lèi)Moment和Coment分別繼承Message,并且分別定義獨(dú)有的一個(gè)字段。三個(gè)類(lèi)映射到數(shù)據(jù)庫(kù),會(huì)被定義為三個(gè)數(shù)據(jù)表:
數(shù)據(jù)表:app_Moment:app代表應(yīng)用,包括id、user_name、content、pub_date和headline五個(gè)字段
數(shù)據(jù)表:app_Coment: 包括包括id、user_name、content、pub_date和level五個(gè)字段
數(shù)據(jù)表:app_Message:包括包括id、user_name、content、pub_date四個(gè)字段
多表繼承時(shí),在子類(lèi)實(shí)例中可以通過(guò)小寫(xiě)的父類(lèi)名字引用父類(lèi)的實(shí)力
e.g:
al = Moment(xx, user_name="test") print(al.message.user_name) #-------> test
3.代理模型繼承
前兩種繼承模型中子類(lèi)都有實(shí)際存儲(chǔ)數(shù)據(jù)的作用,而代理模型繼承父類(lèi)的數(shù)據(jù)而不存儲(chǔ)實(shí)際的數(shù)據(jù),代理模型繼承通過(guò)在子類(lèi)的Meta類(lèi)中定義proxy=True屬性來(lái)實(shí)現(xiàn):
from django.db import models class Mement(models. Model): id = models.AutoField(default=0) content = models.CharField(max_length=100) user_name = models.CharField(max_length=80) pub_date = models.DateField() class OrderByMoment(Moment): #使用代理模型繼承的原因是子類(lèi)中新的特性不會(huì)影響父類(lèi)的模型及其已有代碼的行為 class Meta: proxy = True ordering = ['-pub_date'] #Moment根據(jù)pub_date倒序排列
Moment類(lèi)用于存儲(chǔ)數(shù)據(jù),OrderByMoment類(lèi)用于管理根據(jù)pub_date倒序排列的Moment
希望本文所述對(duì)大家基于Django框架的Python程序設(shè)計(jì)有所幫助。
相關(guān)文章
Python操作Redis數(shù)據(jù)庫(kù)的超詳細(xì)教程
大家應(yīng)該都知道redis是一個(gè)基于內(nèi)存的高效的鍵值型非關(guān)系數(shù)據(jù)庫(kù),下面這篇文章主要給大家介紹了關(guān)于Python操作Redis的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06django API 中接口的互相調(diào)用實(shí)例
這篇文章主要介紹了django API 中接口的互相調(diào)用實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04Python Pandas學(xué)習(xí)之?dāng)?shù)據(jù)離散化與合并詳解
Pandas是python的一個(gè)數(shù)據(jù)分析包,該工具是為解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。本文將通過(guò)示例詳細(xì)為大家介紹一下Pandas的數(shù)據(jù)離散化與合并,需要的可以參考一下2022-02-02Python調(diào)用API接口實(shí)現(xiàn)人臉識(shí)別
本文主要介紹了Python調(diào)用API接口實(shí)現(xiàn)人臉識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02簡(jiǎn)單介紹Python2.x版本中的cmp()方法的使用
這篇文章主要介紹了簡(jiǎn)單介紹Python2.x版本中的cmp()方法的使用,然而該方法在Python3.x版本中已并不再內(nèi)置...需要的朋友可以參考下2015-05-05關(guān)于NumPy中asarray的用法及說(shuō)明
這篇文章主要介紹了關(guān)于NumPy中asarray的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07python實(shí)現(xiàn)中文分詞FMM算法實(shí)例
這篇文章主要介紹了python實(shí)現(xiàn)中文分詞FMM算法,實(shí)例分析了Python基于FMM算法進(jìn)行中文分詞的實(shí)現(xiàn)方法,涉及Python針對(duì)文件、字符串及正則匹配操作的相關(guān)技巧,需要的朋友可以參考下2015-07-07使用Python實(shí)現(xiàn)批量發(fā)送個(gè)性化郵件
在現(xiàn)代工作環(huán)境中,我們經(jīng)常需要向多個(gè)收件人發(fā)送個(gè)性化的郵件,因此本文小編為大家整理了Python實(shí)現(xiàn)批量發(fā)送個(gè)性化郵件的示例代碼,希望對(duì)大家有所幫助2023-11-11Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的完整代碼(面向?qū)ο?
這篇文章主要介紹了Python實(shí)現(xiàn)學(xué)生管理系統(tǒng)的完整代碼(面向?qū)ο?,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04