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) #將這個對象賦給類屬性publisherView 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
到這裡,一個完整的創建數據表,並給數據表添加數據的過程就完成了,過程中其實還有許多細節需要說明,這個在後面的學習中再慢慢補充。