Django ORM 知識概要
阿新 • • 發佈:2019-01-05
- 相關命令
python3 manage.py makemigrations
根據模型生成相關遷移檔案python3 manage.py migrate
根據遷移檔案,將表結構更新到資料庫中,並在Django中帶的migrations資料表中更改資料庫記錄
- 欄位
- 常用的欄位
- 自增長欄位
- models.AutoField()
- models.BigAutoField()
- 二進位制資料
- models.BinaryField()
- 布林型
- 允許為空 models.BooleanField()
- 不允許為空 models.NullBooleanField()
- 整型
- 5個位元組的正整數models.PositiveSmallIntegerField()
- 6個位元組的整數
models.SmallIntegerField() - 11個位元組的整數
models.IntegerField() - 20個位元組的整數
models.BigIntegerField()
- 字串型別
- varchar
models.CharField(max\_length=100) - longtext
models.TextField()
- varchar
- 時間日期型別
- 年月日
models.DateField() - 年月日時分秒
models.DateTimeField() - 一段時間,在資料庫中是int型別,底層是 Python timedelta 實現
models.DurationField()
- 年月日
- 浮點型
- models.FloatField()
- 可以指定整數多少位,小數多少位
models.DecimalField()
- 其它欄位
- 郵箱
models.EmailField() - models.ImageField()
- models.FileField()
- models.FilePathField()
- models.URLField()
- models.UUIDField()
- IP地址,可以是IPV4,也可以是IPV6
models.GenericIPAddressField()
- 郵箱
- 自增長欄位
- 關係型欄位
- 一對一
models.OneToOneField(Model) - 多對一
models.ForeignKey(Model) - 多對多
models.ManyToManyField(Model)
- 一對一
- 欄位型別引數
- 所有欄位都有的引數
- db_column='name'
- primary_key=True
- verbose_name='別名或者註釋'
- unique=True
- null=True,blank=True
- db_index=True 給表單建立索引
- help_text='' 表單中顯示幫助資訊
- editable=False 表單不可編輯
- 個別欄位才有的引數
- 給CharField 指定最大長度 max_length=100
- 時間
- unique_for_date=True
- unique_for_month=True
- auto_now=True 更新時間
- auto_now_add=True 新增時間
- 浮點型 Decimal
- max_digits=4 表示一共有多少位數
- decimal_places=2 表示小數有多少位
- 關係型欄位的引數
- related_name='name' 反向查詢時候可能會用到
- on_delete=value
value的值- CASCADE:刪除引用的物件時,也刪除引用它的物件
- PROTECT:禁止刪除引用的物件。SQL等價物:RESTRICT。
- SET_NULL:將引用設定為NULL(要求欄位可以為空),當欄位設定null=True才可以使用
- SET_DEFAULT:設定預設值。只有當欄位設定了default引數時才能使用 SQL等價物:SET DEFAULT。
- SET(value 或者 函式返回值):設定給定值。這個不是SQL標準的一部分,完全由Django處理。
- DO_NOTHING:SQL等價物:NO ACTION。
- 自關聯
- 寫法一:
modles.ForeignKey('self',verbose_name='自關聯') - 寫法二:
modles.ForeignKey('Model',verbose_name='自關聯')
- 寫法一:
- 所有欄位都有的引數
- 常用的欄位
- 元資料,Meta類定義了一些元資料的資訊,Meta類的欄位如下:
- db_table
- ordering 列表或者元組形式
- verbose_name 別名
- verbose_name_plural 別名複數
- abstract 不同步到資料庫,只是用於被別的類繼承
- permissions 定義許可權
- managed 是否按照Django規則管理模型類 預設是True
- unique_together=()/((),()) 對應MySQL中的聯合唯一約束
- app_label 指定模型屬於哪個應用(如果在settings裡面已經註冊過應用的話,就不用寫這個欄位了)
- db_tablespace 定義資料庫表空間的名字
- Django 資料表操作
- 更改資料表
- 刪除資料庫表步驟
- 刪除對應的模型類程式碼
- 刪除migrationd資料夾下面的模型類
- 刪除Django的migrations表中對應的記錄
- 刪除資料庫表
- 刪除資料庫表步驟
- 匯入資料
- Django shell 匯入資料 引入模型 呼叫模型物件的save方法
- 自己定義一個指令碼批量匯入資料
- fixtures Django serialization -> model 儲存
- python3 manage.py dumpdata > data.json
- python3 manage.py loaddata data.json
- 通過資料庫客戶端或則source檔案匯入資料
- 匯出資料
- python3 manage.py dumpdata > data.json
- pycharm 匯出
- mysqldump 匯出
- 資料操作
- 返回QuerySet 的 API
- all(),filter(),order_by(),exclude(),reverse(),distinct()
- extra(),defer(),only() 實現欄位別名,排除一些欄位,選擇一些欄位
- values(),values_list() 獲取字典或者元組形式的結果集
- dates(),datetimes() 根據時間日期獲取查詢集
- union(),intersection(),difference() 並集,交集,差集;MySQL Innodb 只支援並集
- select_related() 一對一、多對一查詢優化,prefetch_related() 一對多、多對多查詢優化。 反向查詢
- annotate() 使用聚合計數,求和,平均數,raw() 執行原生SQL
annotate()對分組後的結果進行統計 - Model.objects.get().子表的表名 _set.all()
- 不返回QuerySet 的 API
- 獲取物件 get(),get_or_create(),first(),last(),latest(),earliest(),in_bulk()
- 建立物件 create(),bulk_create(),create_or_update() 建立,批量建立,建立或更新
- 更新物件 update(),update_or_create() 更新,更新或建立
- 刪除物件 delete() 使用filter 過濾
- 其它操作 exists(),count(),aggregate() 判斷是否存在,統計個數,聚合
aggregate() 是對這個資料表中的資料進行統計
- 自定義聚合查詢
- 返回QuerySet 的 API
- F物件和Q物件
- F物件:操作欄位的資料
- Q物件:結合 AND , OR ,NOT, | , ~ , & 實現複雜的查詢
- 更改資料表
注: 本文知識點是根據自己的專案經驗及慕課網的教學視訊整理所得,
如需轉載請註明出處:https://www.cnblogs.com/zhuchenglin/p/10223596.html