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

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM