網站首頁 編程語言 正文
1.ORM構建數據表
由于每一個數據表對應一個Model定義,每一個Model都是一個Python類,所以,Model之間是可以繼承的。Django規定,所有的Model都必須繼承自django.db.models.Model
Model中的所有字段都是django.db.models.Field
的子類,Django會根據Field的類型確定數據庫表的字段類型
首先定義定義抽象Model基類:
class BaseModel(models.Model): class Meta: # 抽象類,表現為BaseModel不會創建數據表 abstract = True # 按照創建時間逆序排序 ordering = ['-created_time'] # 定義了兩個類屬性:created_time和last_modified,且都是DateTimeField類型 # auto_now_add用于將首次創建對象時間設置為當前時間 # auto_now用于將每次保存對象時間設置為當前時間 created_time = models.DateTimeField(auto_now_add=True, help_text=u'創建時間') last_modified = models.DateTimeField(auto_now=True, help_text=u'修改時間') # 優化打印(print)Model實例的樣式 def __str__(self): raise NotImplementedError
由于BaseModel直接繼承自django.db.models.Model
,所以,我們創建的實體數據表可以繼承自Base Model,從而實現間接繼承
例如:話題表
class Topic(BaseModel): title = models.CharField(max_length=255, unique=True, help_text=u'話題標題') content = models.TextField(help_text=u'話題內容') is_online = models.BooleanField(default=True, help_text=u'話題是否在線') user = models.ForeignKey(to=User, to_field='id', on_delete=models.CASCADE, help_text=u'關聯用戶表') def __str__(self): return '%d:%s' % (self.id, self.title[0:20])
Topic中除了基本類型的字段定義之外,還包含了一個外鍵(ForeignKey)引用的user字段
評論表:
class Comment(BaseModel): content = models.CharField(max_length=255, help_text=u'話題評論') topic = models.ForeignKey(to=Topic, to_field='id', on_delete=models.CASCADE, help_text=u'關聯話題表') up = models.IntegerField(default=0, help_text=u'支持') down = models.IntegerField(default=0, help_text=u'反對') def __str__(self): return '%d:%s' % (self.id, self.content[0:20])
2.數據遷移
首先,在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
執行migrate
命令將Models映射為數據庫的表:
python manage.py migrate
生成的表結構:
3.Model相關的概念與使用方法
Model的組成部分
每個Model都是一個Python類,且通常會包含四個部分:繼承自django.db.models.Model
、Model元數據聲明(Meta內部類)、若干個Field類型的字段以及__str__
方法
Meta元數據類屬性說明
Meta類用于定義Model的元數據,即不屬于Model的字段,但是可以用來標識它的一些屬性
abstract:
一個布爾類型的變量,如果設置為True,則標識當前的Model是抽象基類,這個元選項不具有傳遞性,只對當前聲明的類有效。例如,對于之前定義的BaseModel,用abstract聲明為抽象基類,但是子類Topic和Comment不受影響
db_table:
這個字段用于指定數據表的名稱
默認會使用Django的表名生成規則,例如Topic會映射到post_topic表。如果想讓Topic映射到topic表,定義db_table='topic'
即可
ordering:
用于指定獲取對象列表時的排序規則
按照created_time逆序排序,可以定義:
ordering = ['-created_time']
先按照created_time逆序排序,再按照last_modified正序排序:
ordering = ['-created_time', 'last_modified']
indexes:
它是一個列表類型的元選項,用來定義Model的索引
- fields:一個列表對象,用于指定索引的字段,是必填項,且至少包含一個字段。
- name:用于標識索引的名稱,是可選的,如果不提供,Django會根據不同的數據庫生成合適的索引名。
- db_tablespace:表空間,也是可選的,常見于PostgreSQL、Oracle數據庫,用于優化數據庫性能
unique_together:
標識聯合唯一約束,在數據庫層面表現為聯合唯一索引
Field的通用字段選項
blank:
對于任何一個屬性,默認是不允許輸入空值的,如果允許這種情況發生,需要設置blank=True
unique:
如果一個字段設置了unique=True
,則表示唯一性索引
null:
規定這個字段的數據是否可以是空值
db_index:
如果該字段經常作為查詢的條件,那么就需要考慮設置db_index選項,以加快數據的檢索速度
default:
用于給字段設置默認值
choices:
設置了choices的字段在管理后臺的顯示上會由文本框變成選擇框,選擇框中的可選值就是choices中的元組
help_text:
這個選項用于在表單中顯示字段的提示信息。例如在管理后臺的編輯頁面,對應在字段輸入框的下方會顯示該選項設定的值
基礎字段類型
- IntegerField:整型字段
- Django還提供了SmallIntegerField(小整數)、BigIntegerField(64位整數)和PositiveIntegerField(只允許存儲大于等于0的整數)等字段類型用來滿足存儲整數的不同業務場景
- AutoField:一個根據ID自增的IntegerField
- 如果覺得AutoField的取值范圍不夠用,可以考慮使用BigAutoField
- CharField:字符字段
- TextField:也是用于存儲字符類型的字段,但是它用于存儲大文本
- BooleanField:布爾類型
- DateField和DateTimeField:標識時間的
- 它們都有兩個特殊的參數選項可以設置
- ①auto_now:這個選項應用在對象保存的時候,會自動設置為當前時間
- ②auto_now_add:當首次創建對象的時候,會自動將字段設置為當前時間
- EmailField:專門用來存儲電子郵件地址的
- 除了之前介紹的幾種常見的類型之外,還有GenericIPAddressField用于存儲IP地址、URLField用于存儲URL、FloatField用于存儲浮點數的字段類型等
關系字段類型
多對一
實例:
user = models.ForeignKey(to=User, to_field='id', on_delete=models.CASCADE, help_text=u'關聯用戶表')
to
:指定所關聯的Model
on_delete
:當刪除關聯表的數據時,Django將根據這個參數設定的值確定應該執行什么樣的SQL約束
- CASCADE:級聯刪除,它是大部分ForeignKey的定義應該選擇的約束。它的表現是刪除了“一”,則“多”會被自動刪除
- PROTECT:刪除被引用對象時,將會拋出ProtectedError異常
- SET_NULL:設置刪除對象所關聯的外鍵字段為null。以Topic和Comment的關系舉例:刪除了Topic,與之相關聯的Comment的topic字段會被設置為null
- SET_DEFAULT:將外鍵字段設置為默認值
- SET(value):刪除被引用對象時,設置外鍵字段為value
- DO_NOTHING:不做任何處理
一對一
實例:
user = models.OneToOneField(to=User, on_delete=models.CASCADE, parent_link=False, help_text=u'關聯用戶表')
多對多關系類型
實例:
books = models.ManyToManyField(to=Book)
原文鏈接:https://blog.csdn.net/Gherbirthday0916/article/details/127261597
相關推薦
- 2022-10-31 Python?NumPy隨機抽模塊介紹及方法_python
- 2022-05-10 筆記本能連接 WiFi,但在瀏覽器中并不能訪問網頁的問題的四種方案;
- 2022-07-30 使用logging模塊debug方法來調試代碼
- 2022-12-27 手把手教你實現一個C++單鏈表_C 語言
- 2022-10-20 C語言手寫集合List的示例代碼_C 語言
- 2022-12-29 Android開發中用Kotlin編寫LiveData組件教程_Android
- 2022-08-12 C#實現簡單的字符串加密_C#教程
- 2022-04-25 python遞歸&迭代方法實現鏈表反轉_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支