Django之model模塊創建表完整過程

来源:https://www.cnblogs.com/jiarenanhao/archive/2018/11/17/9975781.html
-Advertisement-
Play Games

Django中,與資料庫相關的模塊是model模塊,它提供了一種簡單易操作的API方式與資料庫交互,它是通過ORM映射的方式來操作資料庫,一個類對應資料庫一張表,一個類屬性,對應該表的一個欄位,一個實例化的類對象就是一個表中的一行數據信息。在開發的階段,工程師只需要python語言本身進行代碼設計, ...


Django中,與資料庫相關的模塊是model模塊,它提供了一種簡單易操作的API方式與資料庫交互,它是通過ORM映射的方式來操作資料庫,一個類對應資料庫一張表,一個類屬性,對應該表的一個欄位,一個實例化的類對象就是一個表中的一行數據信息。在開發的階段,工程師只需要python語言本身進行代碼設計,而不用太過於分散註意力去操作SQL原生操作語句,這樣的方法既有它的優點,同樣也有不足之處。

它們優缺點的大致如下:

優點:

1、實現了代碼與資料庫的解耦合

2、開發者不需要操作太多的原生SQL,可以提高開發效率

3、防止SQL註入,通過對象操作的方式,預設就是防止SQL註入

缺點:

1、犧牲性能,對象轉換到SQL會存在一定的消耗

2、當需要操作較複雜的語句時,用ORM對象操作的方式很難實現

 

ORM與資料庫的映射關係如下:

表名--------》類名

欄位--------》屬性

表記錄-----》類實例化對象

 

ORM的兩大主要功能:

  操作表:

      --創建表

      --修改表

      --刪除表

  操作表數據行:增、刪、改、查

Django自帶的資料庫為sqlite3,如果需要使用其他資料庫,需要其他的準備工作,並且,使用其他資料庫,需要自己提前建好資料庫,然後通過Django去連接,Django並不會創建資料庫。

本次使用Django自帶資料庫進行練習。使用的是Django2.0版本,python3,pycharm2018.2.4版。

 


完整過程:

一、編寫模型類

在Django項目的APP應用下的models.py文件中編寫類,每一個類就是一個最終都會被映射為一個數據表。在寫類之前有個準備工作,在settings.py文件中的“INSTALLED_APPS”要先加入自己的APP應用,告訴Django有這個應用。如圖:

表分為單表,一對一表,一對多表,多對多表,就是表一般不會獨立存在,總會與其他表存在聯繫。我創建了三個表,一個表為Publish(出版社),一個表為Author(作者),還有一個表Book(書籍),其中表書籍與表出版社是外鍵關係,與作者是多對多的關係。

 1 class Publish(models.Model):
 2     name = models.CharField(max_length=64)
 3     city = models.CharField(max_length=63,null=True)
 4     def __str__(self):
 5         return self.name
 6 
 7 
 8 class Author(models.Model):
 9     name = models.CharField(max_length=30)
10     sex = models.CharField(max_length=20)
11     def __str__(self):
12         return self.name
13 
14 class Book(models.Model):
15     title = models.CharField(max_length=64)
16     price = models.IntegerField()
17     color = models.CharField(max_length=64)
18     page_num = models.IntegerField(null=True)
19     publisher = models.ForeignKey("Publish",on_delete=models.CASCADE,null=True)  #一對多的關係。2.0django中,當有主外鍵和其他對應關係時,需要設置。
20     author = models.ManyToManyField("Author")
21     def __str__(self):
22         return  self.title
創建類

二、生成數據表

創建類的代碼已經,寫好,此時需要兩句代碼將類轉換成對應的數據表:

1 python manage.py makemigrations    #將類轉換成數據表結構
2 
3 python manage.py  migrate               #根據上一句代碼生成數據表
生成數據表

上面兩句代碼先後執行,不出意外,就會在資料庫裡面生成對應的數據表。其中,第一句執行完,會在app應用下的migrations的文件夾下生成操作的記錄文件“0001_initial.py”:

這個是記錄models裡面改動的執行記錄。

 最終生成的數據表如下:

 

三、給表插入數據

現在生成的數據表只是一個空表,接下的工作就是要給表插入數據。

給表Author插入數據,這個表有兩個欄位:

 1 from orm測試.models import Author      #引入app下models模塊下的Author類
 2 
 3 a=Author.objects()                              #創建對象
 4 
 5 a.create(name="莫言”,sex="m")          #下麵三句是分別插入數據
 6 a.create(name="韓寒”,sex="f")
 7 a.create(name="郭敬明”,sex="m")
 8 
 9 
10 #以上是插入數據的一種方法,還有一種方法時save,這種方法沒有create方法效率高。
View Code

 

接下來給表Publish插入數據,註意這個表和Book這個表存在主外鍵關係。

1 from orm測試.models import Publish      #導入表Publish
2 
3 p=Publish.objects
4 
5 p.create(name="北京出版社", city="北京")
6 p.create(name="江蘇出版社", city="江蘇")
7 p.create(name="南京出版社", city="南京")
8 p.create(name="上海出版社", city="上海")
View Code

 

給表Book插入數據,因為裡面欄位publisher和表Author存在主外鍵關係,插入時這個欄位的值為Author表的ID(也可以指定其他欄位,預設時ID最好)。

 1 from orm測試.models import Book
 2 
 3 b=Book.objects()
 4 
 5 b.create(title="西游記", price=50, color="blue" , page_num=45, publisher_id=1)
 6 b.create(title="三國演義", price=56, color="red" , page_num=60, publisher_id=2)
 7 b.create(title="紅樓夢", price=70, color="green" , page_num=80, publisher_id=3)
 8 b.create(title="水滸傳", price=100, color="red" , page_num=120, publisher_id=4)
 9 
10 
11 
12 #最後一個欄位,在models類中,定義的是publisher,但是在最終生成表時,Django自動會加上"_id",因為這個欄位時一個存在主外鍵的欄位。
View Code

 表Book的欄位publisher插入數據還有一種情況,就是不通過賦值id,直接把表publish中某一個對象賦給類屬性publisher。下麵是具體操作。

1 #給表Book的欄位publsiher插入外鍵的另一種方式,直接給欄位publisher賦值,這個值就是#表Publish的某一個對象。
2 
3 p=Publish.objects.filter(id=3)[0]          #拿到一個具體的對象
4 
5 b.filter(id=4).update(publisher=p)       #將這個對象賦給類屬性publisher
View Code

 

 

 

 

還有最後一個表需要插入數據,這個表就是表書籍和表出版社因為多對多關係生成的一張表,這個表也可以自己創建,這裡用了自動生成的那種方式。Django把這個表取名為“book_author”。

 1 #多對多的這種關係,思路就是分別取兩個表的對象,把其中的一個對象加入到另一個對象中,#實現兩個表的多對多的關係,用到的方法也只有一個"add()"。如果移除,用到remove()方#法。
 2 
 3 
 4 方法一:
 5 ---正向查詢。在表Book中,欄位“author”是定義多對多的關係的關鍵,所以在下麵建立的關係的時候,對象可以可以直接引用這個屬性,所以為正向查詢。
 6 
 7 book = models.Book.objects.filter(id=2)[0]          #拿到id=2這個數據行的書對象
 8 authors = models.Author.objects.filter(id_gt=2)   #拿到id大於2的所有集合
 9 book.author.add(*authors)                 #這句就是建立兩個表的關係
10 #book.author.remove(*authors)         #取消兩個表的關係
11 
12 方法二:
13 ---反向查詢。因為在表Author中,沒有定義與表Book相關的欄位,使用_set方法。
14 author = models.objects.filter(id=3)[0]  
15 books = models.Book.filter(id_gt=2)
16 author.book_set.add(*books)
17 #author.book_set.remove(*books)
View Code

 

到這裡,一個完整的創建數據表,並給數據表添加數據的過程就完成了,過程中其實還有許多細節需要說明,這個在後面的學習中再慢慢補充。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (一)希爾排序 先將整個待排記錄序列分割成若幹個子序列,然後分別進行直接插入排序,待整個序列中的數據基本有序時,再對全體記錄進行一次直接插入排序。具體做法是: 1) 算出增量序列 2) 根據增量序列對待排記錄進行直接插入排序 (二)桶排序 ...
  • 首先給大家推薦幾個網頁: http://www.mybatis.cn/ http://blog.csdn.net/isea533/article/category/2092001 http://www.mybatis.org/mybatis-3/zh/index.html http://www.my ...
  • //需先建立student.txt文件#include #include #include #include #include using namespace std; #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define List_INI... ...
  • 在做web開發的時候,過濾器(Filter)和攔截器(Interceptor)很常見,通俗的講,過濾器可以簡單理解為“取你所想取”,忽視掉那些你不想要的東西;攔截器可以簡單理解為“拒你所想拒”,關心你想要拒絕掉哪些東西,比如一個BBS論壇上攔截掉敏感辭彙。依賴於servlet容器,是JavaEE標準... ...
  • 函數在python中作為一等函數,具有以下特點: 1、可以作為參數傳遞給其他函數 2、作為其他函數的值返回 3、能賦值給變數或數據結構中的元素 4、在運行的時候創建 In [1]: def add(x,y): ...: return x+y ...:In [2]: new_add=addIn [3] ...
  • 一、序列化 在存儲數據或者網路傳輸數據的時候,需要對對象進行處理。把對象處理成方便存儲和傳輸的數據格式。這個過程叫序列化。 不同的序列化,結果也不同,但目的是一樣的。都是為了存儲和傳輸。 在python中存在三種序列化的方案: pickle:可將python中的任意數據類型轉化成bytes並寫入到文 ...
  • 介紹: 1 Maven是用來管理jar包的一種工具, 2 Maven主要是構建java項目和java web項目 3 maven項目管理所依賴的jar包不需要手動向工程添加jar包,只需要在pom.xml(maven工程的配置文件)添加jar包的坐標,自動從maven倉庫中下載 jar包、運行 第一 ...
  • 全局光照這個名詞在電腦圖形學里已經不算一個新名詞了,現在一提到擬真度,很多人基本上都會去想到全局光照,這個名詞上世紀七八十年代就有了,好像是由一個叫Jim Kajiya的大神在他那篇已經被引用了不知道多少次的論文里《The Rendering Equation》里提出來的,現在很多全局光照演算法基本 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...