最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django中ORM基本應(yīng)用與原理解析

 更新時(shí)間:2022年10月13日 10:41:19   作者:世界盡頭與你  
Django的ORM模塊是框架特色功能之一,它把數(shù)據(jù)表與Python類對(duì)應(yīng)、表字段與類屬性對(duì)應(yīng)、類實(shí)例與數(shù)據(jù)記錄對(duì)應(yīng),并將對(duì)類實(shí)例的操作映射到數(shù)據(jù)庫(kù)中,這篇文章主要介紹了Django?ORM基本應(yīng)用與原理剖析,需要的朋友可以參考下

1.ORM構(gòu)建數(shù)據(jù)表

由于每一個(gè)數(shù)據(jù)表對(duì)應(yīng)一個(gè)Model定義,每一個(gè)Model都是一個(gè)Python類,所以,Model之間是可以繼承的。Django規(guī)定,所有的Model都必須繼承自django.db.models.Model

Model中的所有字段都是django.db.models.Field的子類,Django會(huì)根據(jù)Field的類型確定數(shù)據(jù)庫(kù)表的字段類型

首先定義定義抽象Model基類:

class BaseModel(models.Model):
    class Meta:
        # 抽象類,表現(xiàn)為BaseModel不會(huì)創(chuàng)建數(shù)據(jù)表
        abstract = True
        # 按照創(chuàng)建時(shí)間逆序排序
        ordering = ['-created_time']

    # 定義了兩個(gè)類屬性:created_time和last_modified,且都是DateTimeField類型
    # auto_now_add用于將首次創(chuàng)建對(duì)象時(shí)間設(shè)置為當(dāng)前時(shí)間
    # auto_now用于將每次保存對(duì)象時(shí)間設(shè)置為當(dāng)前時(shí)間
    created_time = models.DateTimeField(auto_now_add=True, help_text=u'創(chuàng)建時(shí)間')
    last_modified = models.DateTimeField(auto_now=True, help_text=u'修改時(shí)間')

    # 優(yōu)化打?。╬rint)Model實(shí)例的樣式
    def __str__(self):
        raise NotImplementedError

由于BaseModel直接繼承自django.db.models.Model,所以,我們創(chuàng)建的實(shí)體數(shù)據(jù)表可以繼承自Base Model,從而實(shí)現(xiàn)間接繼承

例如:話題表

class Topic(BaseModel):
    title = models.CharField(max_length=255, unique=True, help_text=u'話題標(biāo)題')
    content = models.TextField(help_text=u'話題內(nèi)容')
    is_online = models.BooleanField(default=True, help_text=u'話題是否在線')
    user = models.ForeignKey(to=User, to_field='id', on_delete=models.CASCADE, help_text=u'關(guān)聯(lián)用戶表')

    def __str__(self):
        return '%d:%s' % (self.id, self.title[0:20])

Topic中除了基本類型的字段定義之外,還包含了一個(gè)外鍵(ForeignKey)引用的user字段

評(píng)論表:

class Comment(BaseModel):
    content = models.CharField(max_length=255, help_text=u'話題評(píng)論')
    topic = models.ForeignKey(to=Topic, to_field='id', on_delete=models.CASCADE, help_text=u'關(guān)聯(lián)話題表')
    up = models.IntegerField(default=0, help_text=u'支持')
    down = models.IntegerField(default=0, help_text=u'反對(duì)')

    def __str__(self):
        return '%d:%s' % (self.id, self.content[0:20])

2.數(shù)據(jù)遷移

首先,在settings.py文件中添加此Model視圖的app:(post.apps.PostConfig

INSTALLED_APPS = [
    'post.apps.PostConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

生成遷移文件:

python manage.py makemigrations post

執(zhí)行migrate命令將Models映射為數(shù)據(jù)庫(kù)的表:

python manage.py migrate

生成的表結(jié)構(gòu):

3.Model相關(guān)的概念與使用方法

Model的組成部分

每個(gè)Model都是一個(gè)Python類,且通常會(huì)包含四個(gè)部分:繼承自django.db.models.Model、Model元數(shù)據(jù)聲明(Meta內(nèi)部類)、若干個(gè)Field類型的字段以及__str__方法

Meta元數(shù)據(jù)類屬性說(shuō)明

Meta類用于定義Model的元數(shù)據(jù),即不屬于Model的字段,但是可以用來(lái)標(biāo)識(shí)它的一些屬性

abstract:

一個(gè)布爾類型的變量,如果設(shè)置為T(mén)rue,則標(biāo)識(shí)當(dāng)前的Model是抽象基類,這個(gè)元選項(xiàng)不具有傳遞性,只對(duì)當(dāng)前聲明的類有效。例如,對(duì)于之前定義的BaseModel,用abstract聲明為抽象基類,但是子類Topic和Comment不受影響

db_table:

這個(gè)字段用于指定數(shù)據(jù)表的名稱

默認(rèn)會(huì)使用Django的表名生成規(guī)則,例如Topic會(huì)映射到post_topic表。如果想讓Topic映射到topic表,定義db_table='topic'即可

ordering:

用于指定獲取對(duì)象列表時(shí)的排序規(guī)則

按照created_time逆序排序,可以定義:

ordering = ['-created_time']

先按照created_time逆序排序,再按照l(shuí)ast_modified正序排序:

ordering = ['-created_time', 'last_modified']

indexes:

它是一個(gè)列表類型的元選項(xiàng),用來(lái)定義Model的索引

  • fields:一個(gè)列表對(duì)象,用于指定索引的字段,是必填項(xiàng),且至少包含一個(gè)字段。
  • name:用于標(biāo)識(shí)索引的名稱,是可選的,如果不提供,Django會(huì)根據(jù)不同的數(shù)據(jù)庫(kù)生成合適的索引名。
  • db_tablespace:表空間,也是可選的,常見(jiàn)于PostgreSQL、Oracle數(shù)據(jù)庫(kù),用于優(yōu)化數(shù)據(jù)庫(kù)性能

unique_together:

標(biāo)識(shí)聯(lián)合唯一約束,在數(shù)據(jù)庫(kù)層面表現(xiàn)為聯(lián)合唯一索引

Field的通用字段選項(xiàng)

blank:

對(duì)于任何一個(gè)屬性,默認(rèn)是不允許輸入空值的,如果允許這種情況發(fā)生,需要設(shè)置blank=True

unique:

如果一個(gè)字段設(shè)置了unique=True,則表示唯一性索引

null:

規(guī)定這個(gè)字段的數(shù)據(jù)是否可以是空值

db_index:

如果該字段經(jīng)常作為查詢的條件,那么就需要考慮設(shè)置db_index選項(xiàng),以加快數(shù)據(jù)的檢索速度

default:

用于給字段設(shè)置默認(rèn)值

choices:

設(shè)置了choices的字段在管理后臺(tái)的顯示上會(huì)由文本框變成選擇框,選擇框中的可選值就是choices中的元組

help_text:

這個(gè)選項(xiàng)用于在表單中顯示字段的提示信息。例如在管理后臺(tái)的編輯頁(yè)面,對(duì)應(yīng)在字段輸入框的下方會(huì)顯示該選項(xiàng)設(shè)定的值

基礎(chǔ)字段類型

  • IntegerField:整型字段
  • Django還提供了SmallIntegerField(小整數(shù))、BigIntegerField(64位整數(shù))和PositiveIntegerField(只允許存儲(chǔ)大于等于0的整數(shù))等字段類型用來(lái)滿足存儲(chǔ)整數(shù)的不同業(yè)務(wù)場(chǎng)景
  • AutoField:一個(gè)根據(jù)ID自增的IntegerField
  • 如果覺(jué)得AutoField的取值范圍不夠用,可以考慮使用BigAutoField
  • CharField:字符字段
  • TextField:也是用于存儲(chǔ)字符類型的字段,但是它用于存儲(chǔ)大文本
  • BooleanField:布爾類型
  • DateField和DateTimeField:標(biāo)識(shí)時(shí)間的
  • 它們都有兩個(gè)特殊的參數(shù)選項(xiàng)可以設(shè)置
  • ①auto_now:這個(gè)選項(xiàng)應(yīng)用在對(duì)象保存的時(shí)候,會(huì)自動(dòng)設(shè)置為當(dāng)前時(shí)間
  • ②auto_now_add:當(dāng)首次創(chuàng)建對(duì)象的時(shí)候,會(huì)自動(dòng)將字段設(shè)置為當(dāng)前時(shí)間
  • EmailField:專門(mén)用來(lái)存儲(chǔ)電子郵件地址的
  • 除了之前介紹的幾種常見(jiàn)的類型之外,還有GenericIPAddressField用于存儲(chǔ)IP地址、URLField用于存儲(chǔ)URL、FloatField用于存儲(chǔ)浮點(diǎn)數(shù)的字段類型等

關(guān)系字段類型

多對(duì)一

實(shí)例:

user = models.ForeignKey(to=User, to_field='id', on_delete=models.CASCADE, help_text=u'關(guān)聯(lián)用戶表')

to:指定所關(guān)聯(lián)的Model

on_delete:當(dāng)刪除關(guān)聯(lián)表的數(shù)據(jù)時(shí),Django將根據(jù)這個(gè)參數(shù)設(shè)定的值確定應(yīng)該執(zhí)行什么樣的SQL約束

  • CASCADE:級(jí)聯(lián)刪除,它是大部分ForeignKey的定義應(yīng)該選擇的約束。它的表現(xiàn)是刪除了“一”,則“多”會(huì)被自動(dòng)刪除
  • PROTECT:刪除被引用對(duì)象時(shí),將會(huì)拋出ProtectedError異常
  • SET_NULL:設(shè)置刪除對(duì)象所關(guān)聯(lián)的外鍵字段為null。以Topic和Comment的關(guān)系舉例:刪除了Topic,與之相關(guān)聯(lián)的Comment的topic字段會(huì)被設(shè)置為null
  • SET_DEFAULT:將外鍵字段設(shè)置為默認(rèn)值
  • SET(value):刪除被引用對(duì)象時(shí),設(shè)置外鍵字段為value
  • DO_NOTHING:不做任何處理

一對(duì)一

實(shí)例:

user = models.OneToOneField(to=User, on_delete=models.CASCADE, parent_link=False,
                             help_text=u'關(guān)聯(lián)用戶表')

多對(duì)多關(guān)系類型

實(shí)例:

books = models.ManyToManyField(to=Book)

到此這篇關(guān)于Django ORM基本應(yīng)用與原理剖析的文章就介紹到這了,更多相關(guān)Django ORM原理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中字符串的基礎(chǔ)介紹及常用操作總結(jié)

    Python中字符串的基礎(chǔ)介紹及常用操作總結(jié)

    字符串輸出格式與輸入的樣子相同,都是用撇號(hào)包裹,撇號(hào)和其它特殊字符用用反斜杠轉(zhuǎn)義。如果字符串中有單撇號(hào)而沒(méi)有雙撇號(hào)則用雙撇號(hào)包裹,否則應(yīng)該用單撇號(hào)包裹。后面要介紹的print語(yǔ)句可以不帶撇號(hào)或轉(zhuǎn)義輸出字符串
    2021-09-09
  • Python使用py2exe打包程序介紹

    Python使用py2exe打包程序介紹

    這篇文章主要介紹了Python使用py2exe打包程序介紹,本文講解了py2exe簡(jiǎn)介、安裝、用法、指定額外文件等內(nèi)容,需要的朋友可以參考下
    2014-11-11
  • python中查看變量?jī)?nèi)存地址的方法

    python中查看變量?jī)?nèi)存地址的方法

    這篇文章主要介紹了python中查看變量?jī)?nèi)存地址的方法,涉及Python中id使用技巧,需要的朋友可以參考下
    2015-05-05
  • Python實(shí)現(xiàn)的百度站長(zhǎng)自動(dòng)URL提交小工具

    Python實(shí)現(xiàn)的百度站長(zhǎng)自動(dòng)URL提交小工具

    這篇文章主要介紹了Python實(shí)現(xiàn)的百度站長(zhǎng)自動(dòng)URL提交小工具,主要難點(diǎn)在驗(yàn)證碼識(shí)別部分,研究驗(yàn)證碼識(shí)別的朋友可以參考下
    2014-06-06
  • 利用python繪制數(shù)據(jù)曲線圖的實(shí)現(xiàn)

    利用python繪制數(shù)據(jù)曲線圖的實(shí)現(xiàn)

    這篇文章主要介紹了利用python繪制數(shù)據(jù)曲線圖的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • python實(shí)現(xiàn)圖片插入文字

    python實(shí)現(xiàn)圖片插入文字

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)圖片插入文字,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Python實(shí)現(xiàn)替換文件中指定內(nèi)容的方法

    Python實(shí)現(xiàn)替換文件中指定內(nèi)容的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)替換文件中指定內(nèi)容的方法,涉及Python文件讀寫(xiě)、字符串替換等相關(guān)操作技巧,需要的朋友可以參考下
    2018-03-03
  • 在Django中使用MQTT的方法

    在Django中使用MQTT的方法

    這篇文章主要介紹了在Django中使用MQTT的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Python實(shí)現(xiàn)爬蟲(chóng)抓取與讀寫(xiě)、追加到excel文件操作示例

    Python實(shí)現(xiàn)爬蟲(chóng)抓取與讀寫(xiě)、追加到excel文件操作示例

    這篇文章主要介紹了Python實(shí)現(xiàn)爬蟲(chóng)抓取與讀寫(xiě)、追加到excel文件操作,結(jié)合具體實(shí)例形式分析了Python針對(duì)糗事百科的抓取與Excel文件讀寫(xiě)相關(guān)操作技巧,需要的朋友可以參考下
    2018-06-06
  • django admin 根據(jù)choice字段選擇的不同來(lái)顯示不同的頁(yè)面方式

    django admin 根據(jù)choice字段選擇的不同來(lái)顯示不同的頁(yè)面方式

    這篇文章主要介紹了django admin 根據(jù)choice字段選擇的不同來(lái)顯示不同的頁(yè)面方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-05-05

最新評(píng)論

米林县| 水富县| 盐源县| 云龙县| 上高县| 沙雅县| 若羌县| 嘉善县| 江源县| 阿城市| 兴和县| 漳平市| 克什克腾旗| 兰坪| 酉阳| 聊城市| 磐安县| 安远县| 如东县| 望奎县| 略阳县| 汨罗市| 龙川县| 北宁市| 云龙县| 邹城市| 阿拉尔市| 枣庄市| 广州市| 东乌珠穆沁旗| 安阳市| 滦南县| 措勤县| 大同县| 玉林市| 大港区| 登封市| 横山县| 保德县| 平原县| 南宁市|