Django之多表操作1
阿新 • • 發佈:2021-12-30
建立模型
建立一個多表模型
from django.db import models # 表app01_publish class Publish(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=20) # 表app01_book class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField(max_length=20) price = models.DecimalField(max_digits=8, decimal_places=2) pub_date = models.DateField() # 表app01_book多對一表app01_publish,引數to指定模型名,引數to_field指定要關聯的那個欄位 publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE) # 我們自己寫sql時,針對書籍表與作者表的多對關係,需要自己建立新表,而基於django的orm,下面這一行程式碼可以幫我們自動建立那張關係表 authors=models.ManyToManyField(to='Author') # 變數名為authors,則新表名為app01_book_authors,若變數名為xxx,則新表名為app01_book_xxx # 表app01_author class Author(models.Model): nid = models.AutoField(primary_key=True) name = models.CharField(max_length=20) age = models.IntegerField() # 表app01_author一對一表app01_authordetail author_detail= models.OneToOneField(to='AuthorDetail',to_field='nid',unique=True,on_delete=models.CASCADE) # 表app01_authordetail class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) tel = models.CharField(max_length=20)
關鍵在於
在建立關聯時,針對引數to,如果傳入的是字串(to="模型名"),則模型類的定義不區分先後順序,如果傳入的是模型名(to=Author),則Author類必須事先定義
新增、刪除、修改記錄
由於foreign key的關係,我們需要事先往app01_publish與app01_authordetail裡插入記錄
# 1、需求:通過模型Publish往表app01_publish裡插入三家出版社 Publish.objects.create(name='北京出版社') Publish.objects.create(name='長春出版社') Publish.objects.create(name='大連出版社') # 2、需求:通過模型AuthorDetail往表app01_authordetail裡插入三條作者詳情 AuthorDetail.objects.create(tel='18611312331') AuthorDetail.objects.create(tel='15033413881') AuthorDetail.objects.create(tel='13011453220')
1、多對一:app01_book與app01_publish
# 需求:書籍(葵花寶典、菊花寶典、桃花寶典)都是在北京出版社出版的 # 1、先通過模型Publish從出版社表app01_publish查出北京出版社 publish_obj=Publish.objects.filter(name='北京出版社').first() # 上述程式碼也可以簡寫為:publish_obj=Publish.objects.get(name='北京出版社') # 2、再通過模型Book往書籍表app01_book裡插入三本書籍與出版社的對應關係 # 方式一:使用publish引數指定關聯 book_obj1=Book.objects.create(title='葵花寶典',price=2000,pub_date='1985-3-11',publish=publish_obj) book_obj2=Book.objects.create(title='菊花寶典',price=3000,pub_date='1990-1-21',publish=publish_obj) book_obj3=Book.objects.create(title='桃花寶典',price=4000,pub_date='1991-1-23',publish=publish_obj) # 方式二:使用publish_id引數指定關聯 book_obj1=Book.objects.create(title='葵花寶典',price=2000,pub_date='1985-3-11',publish_id=publish_obj.nid) book_obj2=Book.objects.create(title='菊花寶典',price=3000,pub_date='1990-1-21',publish_id=1) # 在已經出版社id的情況下,可以直接指定 book_obj3=Book.objects.create(title='桃花寶典',price=4000,pub_date='1991-1-23',publish_id=1) # 注意:無論方式一還是方式二得到的書籍物件book_obj1、book_obj2、book_obj3 # 都可以呼叫publish欄位來訪問關聯的那一個出版社物件 # 都可以呼叫publish_id來訪問關聯的那一個出版社物件的nid print(book_obj1.publish,book_obj1.publish_id) print(book_obj2.publish,book_obj2.publish_id) print(book_obj3.publish,book_obj3.publish_id) # 三本書關聯的是同一個出版社,所以輸出結果均相同
參照上述步驟,把剩餘三本書與出版社的對應關係也插入
book_obj1 = Book.objects.create(title='玉女心經', price=5000, pub_date='1988-3-24', publish_id=2) book_obj2 = Book.objects.create(title='玉男心經', price=3000, pub_date='1985-6-17', publish_id=2) book_obj3 = Book.objects.create(title='九陰真經', price=6000, pub_date='1983-8-17', publish_id=3)
2、一對一:app01_author與app01_authordetail
# 需求:插入三個作者,並與作者詳情表一一對應 # 由於作者詳情表我們已經事先建立好記錄,所以只需要往作者表插入記錄即可 # 方式一:需要事先過濾出作者詳情的物件,然後通過模型Author的欄位author來指定要關聯的作者詳情物件(略) # 方式二:確定作者詳情物件的id,然後通過模型Author通過欄位author_id來指定關聯關係, Author.objects.create(name='egon',age=18,author_detail_id=1) Author.objects.create(name='kevin',age=38,author_detail_id=2) Author.objects.create(name='rose',age=28,author_detail_id=3)
3、多對多:app01_book與app01_author
# 我們參照物理表app01_book_authors制定需求,需要建立如下關係 # 1、葵花寶典的作者為:egon、kevin # 2、菊花寶典的作者為:egon、kevin、rose # 3、桃花寶典的作者為:egon、kevin # 4、玉女心經的作者為:kevin、rose # 5、玉男心經的作者為:kevin # 6、九陰真經的作者為:egon、rose # 需要創建出上述關係,具體做法如下 # 1、先獲取書籍物件 book_obj1=Book.objects.get(title='葵花寶典') book_obj2=Book.objects.get(title='菊花寶典') book_obj3=Book.objects.get(title='桃花寶典') book_obj4=Book.objects.get(title='玉女心經') book_obj5=Book.objects.get(title='玉男心經') book_obj6=Book.objects.get(title='九陰真經') # 2、然後獲取作者物件 egon=Author.objects.get(name='egon') kevin=Author.objects.get(name='kevin') rose=Author.objects.get(name='rose') # 3、最後依次建立上述關係:在原生SQL中多對多關係涉及到操作第三張關係表,但是在ORM中我們只需要操作模型類Book下的欄位author即可 book_obj1.authors.add(egon,kevin) book_obj2.authors.add(egon,kevin,rose) book_obj3.authors.add(egon,kevin) book_obj4.authors.add(kevin,rose) book_obj5.authors.add(kevin) book_obj6.authors.add(egon,rose)