1. 程式人生 > >Django之model模組建立表完整過程

Django之model模組建立表完整過程

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

 

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