一、多表操作之模型創建
1 圖書表:book,作者表:author,作者詳情表:authordetail,出版社表:publish,(第三張中間表) 2 作者跟作者詳情:是一對一,關聯欄位寫在哪一方都可以 3 圖書跟出版社:是一對多,一對多關系一旦確立,關聯欄位寫在多的一方 4 圖書和作者:是多對多,多對多的關系需要建立第三張表(可以自動生成) 5 models.py中把關系建立出來 from django.db import models ### django: 1.11.1 2.0.7 # Create your models here. class Publish(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) addr = models.CharField(max_length=64) phone = models.CharField(max_length=64) email = models.EmailField() class Book(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) price = models.DecimalField(max_digits=6, decimal_places=2) publish_date = models.DateTimeField(auto_now_add=True) # to='Publish'跟Publish表做關聯(ForeignKey,一對多) # to_field='id'跟哪個欄位做關聯 # publish=models.CharField(max_length=32) # publish=models.ForeignKey(to='Publish',to_field='id') # publish = models.ForeignKey(to='Publish') # 不寫,默認跟主鍵做關聯 publish = models.ForeignKey(to=Publish) # 不寫,默認跟主鍵做關聯 # 自動創建出第三張表(這句話會自動創建第三章表) # authors在資料庫中不存在該欄位,沒有to_field # 默認情況:第三張表有id欄位,當前Book表的id和Author表的id欄位 authors=models.ManyToManyField(to='Author') class Author(models.Model): id = models.AutoField(primary_key=True) name = models.CharField(max_length=32) age = models.SmallIntegerField() # 一對一的本質是 ForeignKey+unique author_detail=models.OneToOneField(to='AuthorDetail',to_field='id') # author_detail=models.ForeignKey(to='AuthorDetail',to_field='id',unique=True) class AuthorDetail(models.Model): id = models.AutoField(primary_key=True) sex = models.SmallIntegerField() addr = models.CharField(max_length=64) phone = models.BigIntegerField() 6 同步到mysql資料庫 -組態檔 -pymysql.install_as_mysqldb() -公司可以用過的mysqlclient -兩條命令 7 2.x版本的django -外鍵欄位必須加 引數:on_delete -1.x版本不需要,默認就是級聯洗掉 -假設, 洗掉出版社,該出版社出版的所有圖書也都洗掉,on_delete=models.CASCADE 洗掉出版社,該出版社出版的圖書不洗掉,設定為空on_delete=models.SET_NULL,null=True 洗掉出版社,該出版社出版的圖書不洗掉,設定為默認on_delete=models.SET_DEFAULT,default=0
二、一對多添加記錄
publish=models.Publish.objects.create(name='北京出版社',addr='北京',phone='0536-12345678',email='郵箱地址') # 新增金梅圖書 book=models.Book.objects.create(name='金梅',price='23.45',publish=publish)# publish=物件 # book=models.Book.objects.create(name='西游記',price='23.55',publish_id=1)# publish_id=數字 # 新增西游記 book=models.Book.objects.create(name='西游記',price='23.55',publish_id=publish.id)# publish_id=數字 # 總結: 1 email可以不傳email,本質就是varchar(admin中會判斷) 2 新增圖書: -publish=publish -publish_id=publish.id 3 寫在表模型中的publish欄位,到資料庫中會變成publish_id(ForeignKey) 4 查到book物件以后 -book.publish 物件 -book.publish_id id號,數字
三、多對多添加記錄,修改,洗掉
1 自動創建的表,表模型就拿不到,book.authors代指表模型 # 多對多,作者和書 # 給西游記這本書新增兩個作者lqz和egon # 去到西游記這本書 # book=models.Book.objects.get(name='西游記') # 代指中間表book.authors # lqz=models.Author.objects.get(id=2) # egon=models.Author.objects.get(id=3) # book.authors.add(2,3) # 新增作者,通過id新增 # # book.authors.add(lqz,egon) # 新增作者,通過物件新增 # book.authors.add(2,egon) # 新增作者,通過物件新增 # 西游記洗掉一個作者 # book = models.Book.objects.get(name='西游記') # book.authors.remove(2) # egon = models.Author.objects.get(id=3) # book.authors.remove(egon) # clear 清空所有作者 book = models.Book.objects.get(name='西游記') # book.authors.add(2, 3) # book.authors.clear() # set 先清空,再add,前提是不存在的作者 book.authors.set([4, ]) # add ,remove,set clear
四、多對多其他api
# 詳見 add ,remove,set clear
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/173197.html
標籤:架構設計
