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方法效率高。
接下來給表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="上海")
給表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",因為這個字段時一個存在主外鍵的字段。
表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
還有最后一個表需要插入數據,這個表就是表書籍和表出版社因為多對多關系生成的一張表,這個表也可以自己創建,這里用了自動生成的那種方式。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)
到這里,一個完整的創建數據表,並給數據表添加數據的過程就完成了,過程中其實還有許多細節需要說明,這個在后面的學習中再慢慢補充。