Web开发-Django模型层
生活随笔
收集整理的這篇文章主要介紹了
Web开发-Django模型层
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
Django模型層
- 簡述
- Django框架處理業(yè)務(wù)的邏輯一般如下(省略圖,源于網(wǎng)絡(luò),侵刪)
- 可以看到,Django自帶了一套ORM機(jī)制,這也是Django框架的核心—“全面”,將一切能幫開發(fā)者完成的率先完成。使用Django開發(fā),只需要知道它的模型層如何使用,甚至可以不用系統(tǒng)學(xué)習(xí)過數(shù)據(jù)庫及其使用。
- 在之前的博客,我已經(jīng)初步介紹了Django的主要組件,以及搭建了一個小站點(diǎn),在這篇,將詳細(xì)談一談Django模型層的點(diǎn)點(diǎn)滴滴。
- Django框架處理業(yè)務(wù)的邏輯一般如下(省略圖,源于網(wǎng)絡(luò),侵刪)
- 注意
- 使用Django的ORM模型,那么建議預(yù)先創(chuàng)建相關(guān)的模型文件再進(jìn)行數(shù)據(jù)庫的遷移。
- 每個模型類都會被映射到數(shù)據(jù)庫中的一個表,類的屬性被映射為表中的字段。(這就是ORM的核心思路)。除此之外,數(shù)據(jù)庫的主鍵、外鍵、約束都可以通過類屬性定義。
- 基本操作
- 模型類定義
- 一般在該app的models.py文件中
- 所有Django模型都必須繼承自django.db.models.Model類,否則無法完成向?qū)嶋H數(shù)據(jù)庫的遷移。
- 一般格式
- class ModelName(models.Model):field1 = models.XField(...)field2 = models.XField(...)...class Meta:db_table = ...other_metas = ...
- 解析
- 繼承自Model類
- 通過類屬性定義模型字段,必須是某種models.XField類型
- DjangoField類型與數(shù)據(jù)庫中數(shù)據(jù)類型對應(yīng)如下(見源碼,這里只列舉了常用的MySQL的,其余的可以到django.db.backends.DBName中base.py查看)
- _data_types = {'AutoField': 'integer AUTO_INCREMENT','BinaryField': 'longblob','BooleanField': 'bool','CharField': 'varchar(%(max_length)s)','CommaSeparatedIntegerField': 'varchar(%(max_length)s)','DateField': 'date','DateTimeField': 'datetime','DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)','DurationField': 'bigint','FileField': 'varchar(%(max_length)s)','FilePathField': 'varchar(%(max_length)s)','FloatField': 'double precision','IntegerField': 'integer','BigIntegerField': 'bigint','IPAddressField': 'char(15)','GenericIPAddressField': 'char(39)','NullBooleanField': 'bool','OneToOneField': 'integer','PositiveIntegerField': 'integer UNSIGNED','PositiveSmallIntegerField': 'smallint UNSIGNED','SlugField': 'varchar(%(max_length)s)','SmallIntegerField': 'smallint','TextField': 'longtext','TimeField': 'time','UUIDField': 'char(32)',}
- 通過Meta子類定義元數(shù)據(jù),如數(shù)據(jù)庫表名,可讀化名稱,數(shù)據(jù)排序方式等。
- Meta類屬性名Django預(yù)定義,不可以超過這個范圍。
- verbose_name: 字符串表示,該模型的可讀化名稱。
- verbose_name_plural: 字符串表示,上述名稱的復(fù)數(shù)形式。
- abstract: True or False,標(biāo)識本類是否為抽象基類。
- app_label: 字符串表示,定義本類所屬的應(yīng)用。
- db_table: 字符串表示,映射的數(shù)據(jù)庫表名,不寫會默認(rèn)生成一定格式的表名(應(yīng)用名_模型名),可讀性較差。
- db_tablespace: 字符串表示,映射的表空間名稱。表空間的概念只在某些數(shù)據(jù)庫如Oracle中存在,沒有這個概念的數(shù)據(jù)庫忽略即可。
- default_related_name: 字符串表示,定義本模型的反向關(guān)系引用名稱,默認(rèn)與模型名一致。
- get_latest_by:日期或者整形的模型字段,定義按照哪個字段值排列以獲得模型的開始或結(jié)束記錄。
- managed:True or False,定義Django的manage.py命令行工具是否管理本模型,默認(rèn)為True。
- order_with_respect_to: 定義本模型可以按照某外鍵引用的關(guān)系排序。
- ordering:列表表示,定義本模型所有記錄的默認(rèn)排序字段,可以多個,默認(rèn)升序,降序則在字段前加負(fù)號。(ordering = [‘field1’, ‘field2’]
- default_permissions: 元組表示, 模型操作權(quán)限,默認(rèn)為(‘a(chǎn)dd’, ‘change’, ‘delete’)
- proxy: True or False,本模型及其子模型是否為代理模型。
- required_db_feathers: 列表表示,定義底層數(shù)據(jù)庫所必備的特性。
- required_db_cendor: 定義底層數(shù)據(jù)庫類型,如SQLite,MySQL。
- unique_together: 用來設(shè)置的不重復(fù)字段組合,必須唯一。如((‘field1’, ‘field2’),)。
- index_together: 定義聯(lián)合索引的字段,可以多個。如[[‘field1’, ‘field2’],]。
- Meta類屬性名Django預(yù)定義,不可以超過這個范圍。
- DjangoField類型與數(shù)據(jù)庫中數(shù)據(jù)類型對應(yīng)如下(見源碼,這里只列舉了常用的MySQL的,其余的可以到django.db.backends.DBName中base.py查看)
- 普通字段
- 常用字段
- CharField:字符串字段
- AutoField:自增的整型字段
- TextField:大容量文本字段
- DateField:日期字段
- 具體參考源碼
- 常用字段參數(shù)
- null:設(shè)置該字段數(shù)據(jù)庫字段是否可以為Null
- blank:設(shè)置字段是否可以為空,用于字段的表單驗證,即是否可以不輸入。
- choices:設(shè)置字段的可選值,二維元組傳入,每個元組第一個值是實際存儲的值,第二個值是HTML頁面進(jìn)行選擇時顯示的值。
- default:設(shè)置默認(rèn)值。
- help_text:HTML頁面輸入控件的幫助字符串。
- primary_key:設(shè)置字段是否為主鍵,只可以設(shè)置一個字段,若字段類型是AutoField,那么必須設(shè)置為主鍵。
- unique:設(shè)置是否為字段定義數(shù)據(jù)庫的唯一約束。
- verbose_name:字段的人性化名稱。
- 常用字段
- 關(guān)系字段(約束表與表之間)
- 一對一關(guān)系
- OneToOneField
- 一對多關(guān)系
- ForeignKey
- 多對多關(guān)系
- ManyToManyField
- 一對一關(guān)系
- 基本操作(增刪查改)
- 創(chuàng)建模型
- class User(models.Model):name = models.CharField(max_length=10, null=False, verbose_name="名字")age = models.IntegerField(null=False, verbose_name="年齡")class Meta:db_table = 'User'verbose_name = "用戶"def __str__(self):return self.name
- 數(shù)據(jù)庫準(zhǔn)備遷移
- 命令行輸入python manage.py makemigrations
- 此時會輸出數(shù)據(jù)庫的改變(記住,app一定要加入settings.py文件中)
- 數(shù)據(jù)庫遷移
- 命令行輸入python manage.py migrate
- 此時會反饋數(shù)據(jù)庫操作
- 可以看到,數(shù)據(jù)庫表創(chuàng)建成功,因為沒有設(shè)置id這個字段,會自動補(bǔ)充并作為主鍵。
- 增加
- 傳統(tǒng)的save方法(對對象操作)
- user = models.User()user.name = "名稱1"user.age = 18user.save()
- create方法
- models.User.objects.create(name="名稱3", age=22)
- 數(shù)據(jù)的確加入到數(shù)據(jù)庫中
- 傳統(tǒng)的save方法(對對象操作)
- 刪除
- 刪除所有
- User.objects.all().delete()
- 過濾刪除
- User.objects.filter(name="名稱1").delete()
- 刪除所有
- 查詢
- 查詢所有
- User.objects.all()
- 查詢指定數(shù)據(jù)
- User.objects.get(id=1)
- 過濾查詢
- User.objects.filter(age=18).distinct()
- 查詢所有
- 修改
- 獲得對象再修改
- user = User.objects.get(id=1)
- user.name="new"
- user.save()
- 獲得對象使用update
- User.objects.get(id=1).update(name="new")
- 獲得對象集合,集體修改
- User.objects.filter(age=10).update(name="hhh")
- 獲得對象再修改
- 注意:django有兩種過濾器為filter和exclude,參數(shù)一致,前者返回符合條件的,后者返回不符合條件的。
- 創(chuàng)建模型
- 模型類定義
- 補(bǔ)充說明
- 具體介紹了模型層的相關(guān)內(nèi)容
- 本項目參考書為《Python高效開發(fā)實戰(zhàn)》劉長龍著
- 使用到的所有重要包會列在requirements.txt文件中
- 具體代碼可以查看我的GitHub,歡迎star或者fork
總結(jié)
以上是生活随笔為你收集整理的Web开发-Django模型层的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习-人工神经网络概述
- 下一篇: Web开发-Django视图层