Web开发-Django模型层
生活随笔
收集整理的這篇文章主要介紹了
Web开发-Django模型层
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Django模型層
- 簡述
- Django框架處理業務的邏輯一般如下(省略圖,源于網絡,侵刪)
- 可以看到,Django自帶了一套ORM機制,這也是Django框架的核心—“全面”,將一切能幫開發者完成的率先完成。使用Django開發,只需要知道它的模型層如何使用,甚至可以不用系統學習過數據庫及其使用。
- 在之前的博客,我已經初步介紹了Django的主要組件,以及搭建了一個小站點,在這篇,將詳細談一談Django模型層的點點滴滴。
- Django框架處理業務的邏輯一般如下(省略圖,源于網絡,侵刪)
- 注意
- 使用Django的ORM模型,那么建議預先創建相關的模型文件再進行數據庫的遷移。
- 每個模型類都會被映射到數據庫中的一個表,類的屬性被映射為表中的字段。(這就是ORM的核心思路)。除此之外,數據庫的主鍵、外鍵、約束都可以通過類屬性定義。
- 基本操作
- 模型類定義
- 一般在該app的models.py文件中
- 所有Django模型都必須繼承自django.db.models.Model類,否則無法完成向實際數據庫的遷移。
- 一般格式
- class ModelName(models.Model):field1 = models.XField(...)field2 = models.XField(...)...class Meta:db_table = ...other_metas = ...
- 解析
- 繼承自Model類
- 通過類屬性定義模型字段,必須是某種models.XField類型
- DjangoField類型與數據庫中數據類型對應如下(見源碼,這里只列舉了常用的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子類定義元數據,如數據庫表名,可讀化名稱,數據排序方式等。
- Meta類屬性名Django預定義,不可以超過這個范圍。
- verbose_name: 字符串表示,該模型的可讀化名稱。
- verbose_name_plural: 字符串表示,上述名稱的復數形式。
- abstract: True or False,標識本類是否為抽象基類。
- app_label: 字符串表示,定義本類所屬的應用。
- db_table: 字符串表示,映射的數據庫表名,不寫會默認生成一定格式的表名(應用名_模型名),可讀性較差。
- db_tablespace: 字符串表示,映射的表空間名稱。表空間的概念只在某些數據庫如Oracle中存在,沒有這個概念的數據庫忽略即可。
- default_related_name: 字符串表示,定義本模型的反向關系引用名稱,默認與模型名一致。
- get_latest_by:日期或者整形的模型字段,定義按照哪個字段值排列以獲得模型的開始或結束記錄。
- managed:True or False,定義Django的manage.py命令行工具是否管理本模型,默認為True。
- order_with_respect_to: 定義本模型可以按照某外鍵引用的關系排序。
- ordering:列表表示,定義本模型所有記錄的默認排序字段,可以多個,默認升序,降序則在字段前加負號。(ordering = [‘field1’, ‘field2’]
- default_permissions: 元組表示, 模型操作權限,默認為(‘add’, ‘change’, ‘delete’)
- proxy: True or False,本模型及其子模型是否為代理模型。
- required_db_feathers: 列表表示,定義底層數據庫所必備的特性。
- required_db_cendor: 定義底層數據庫類型,如SQLite,MySQL。
- unique_together: 用來設置的不重復字段組合,必須唯一。如((‘field1’, ‘field2’),)。
- index_together: 定義聯合索引的字段,可以多個。如[[‘field1’, ‘field2’],]。
- Meta類屬性名Django預定義,不可以超過這個范圍。
- DjangoField類型與數據庫中數據類型對應如下(見源碼,這里只列舉了常用的MySQL的,其余的可以到django.db.backends.DBName中base.py查看)
- 普通字段
- 常用字段
- CharField:字符串字段
- AutoField:自增的整型字段
- TextField:大容量文本字段
- DateField:日期字段
- 具體參考源碼
- 常用字段參數
- null:設置該字段數據庫字段是否可以為Null
- blank:設置字段是否可以為空,用于字段的表單驗證,即是否可以不輸入。
- choices:設置字段的可選值,二維元組傳入,每個元組第一個值是實際存儲的值,第二個值是HTML頁面進行選擇時顯示的值。
- default:設置默認值。
- help_text:HTML頁面輸入控件的幫助字符串。
- primary_key:設置字段是否為主鍵,只可以設置一個字段,若字段類型是AutoField,那么必須設置為主鍵。
- unique:設置是否為字段定義數據庫的唯一約束。
- verbose_name:字段的人性化名稱。
- 常用字段
- 關系字段(約束表與表之間)
- 一對一關系
- OneToOneField
- 一對多關系
- ForeignKey
- 多對多關系
- ManyToManyField
- 一對一關系
- 基本操作(增刪查改)
- 創建模型
- 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
- 數據庫準備遷移
- 命令行輸入python manage.py makemigrations
- 此時會輸出數據庫的改變(記住,app一定要加入settings.py文件中)
- 數據庫遷移
- 命令行輸入python manage.py migrate
- 此時會反饋數據庫操作
- 可以看到,數據庫表創建成功,因為沒有設置id這個字段,會自動補充并作為主鍵。
- 增加
- 傳統的save方法(對對象操作)
- user = models.User()user.name = "名稱1"user.age = 18user.save()
- create方法
- models.User.objects.create(name="名稱3", age=22)
- 數據的確加入到數據庫中
- 傳統的save方法(對對象操作)
- 刪除
- 刪除所有
- User.objects.all().delete()
- 過濾刪除
- User.objects.filter(name="名稱1").delete()
- 刪除所有
- 查詢
- 查詢所有
- User.objects.all()
- 查詢指定數據
- 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,參數一致,前者返回符合條件的,后者返回不符合條件的。
- 創建模型
- 模型類定義
- 補充說明
- 具體介紹了模型層的相關內容
- 本項目參考書為《Python高效開發實戰》劉長龍著
- 使用到的所有重要包會列在requirements.txt文件中
- 具體代碼可以查看我的GitHub,歡迎star或者fork
總結
以上是生活随笔為你收集整理的Web开发-Django模型层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习-人工神经网络概述
- 下一篇: Web开发-Django视图层