<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Django -- 多表操作

      表之間的關系

      • 一對一
        xx=models.OneToOneField(to='要關聯的表名',to_field='要關聯表名的字段',on_delete=models.CASCADE)
        # on_delete 刪除時的一些級聯效果,to_field可以不用寫,默認是關聯到另一張表的主鍵,on_field在1.x版本的Django中不用寫,默認是級聯刪除的,2.x的版本中必須要寫
      • 一對多
        xx=models.foreignKey(to='要關聯的表名',to_field='要關聯表名的字段',on_delete=models.CASCADE)
      • 多對多
        xx = models.ManyToManyField(to='另外一個表名') #這是自動創建的第三表

          

      建表準備

      • 建立四張表: 作者表 -- 作者信息表 -- 出版社表 -- 書籍表
      • 表之間的對應關系如下
        • 一個作者應該對應一個相應的作者信息,所以作者表與作者信息表的關系為一對一 :  oneToOnefield
        • 一個出版社可以出版很多書,一本書也可以有多個出版社出版,為多對多,但是在這里將此設置為一個出版社出很對書,一對多的關系: foreignkey
        • 作者和書籍的關系為多對多: ManyToManyField

          

      # 作者表
      class Author(models.Model):
          name=models.CharField( max_length=32)
          age=models.IntegerField()
      #authorDetail=models.OneToOneField(to="AuthorDetail",to_field="nid",on_delete=models.CASCADE)
          authorDetail=models.OneToOneField(to='AuthorDetail')  #一對一到AuthorDetail表  生成為表字段之后,會自動變為authorDetail_id這樣的一個名稱
          def __str__(self):
              return self.name
      
      # 作者詳細信息表
      class AuthorDetail(models.Model):
          birthday=models.DateField()
          telephone=models.CharField(max_length=32)
          addr=models.CharField( max_length=64)
          def __str__(self):
              return self.addr
      
      # 出版社表和書籍表 是 一對多的關系
      class Publish(models.Model):
          name=models.CharField( max_length=32)
          city=models.CharField( max_length=32)
          email=models.EmailField() 
          def __str__(self):
              return self.name
      
      # 書籍表
      class Book(models.Model):
          nid = models.AutoField(primary_key=True)
          title = models.CharField( max_length=32)
          publishDate=models.DateField()
          price=models.DecimalField(max_digits=5,decimal_places=2)  # 整數位5位,小數位2位
          publishs=models.ForeignKey(to="Publish")
          authors=models.ManyToManyField(to='Author',) # 注意不管是一對多還是多對多,寫to這個參數的時候,最后后面的值是個字符串,不然你就需要將你要關聯的那個表放到這個表的上面
          def __str__(self):
              return self.title
      View Code

       

        

      增加數據

      • 一對一增加(先給作者詳細信息表中增加數據,再增加作者表的數據)
        new_author_detail = models.AuthorDetail.objects.create(
            birthday='1979-08-08',
            telephone='138383838',
            addr='北京',
        )
        obj = models.AuthorDetail.objects.filter(addr='山西').first()
        
        #方式1
        models.Author.objects.create(
            name='張三',
            age='40',
            authorDetail=new_author_detail,
        )
        # 方式2  常用
        models.Author.objects.create(
            name='張三',
            age='40',
            authorDetail_id=obj.id,
        )

         

      • 一對多增加
        # 方式1
        models.Book.objects.create(
            title = '追風箏的人',
            publishDate='2019-07-22',
            price=25,
            publishs=models.Publish.objects.get(id=1),
        )
        
        # 方式2 常用
        obj = models.Publish.objects.get(id=1)
        models.Book.objects.create(
            title='追風箏的人',
            publishDate='2019-07-21',
            price=25,
            publishs_id=obj.id
        )

         

      • 多對多增加
        # 方式1   常用
        book_obj = models.Book.objects.get(id=1)  # 拿到book的id
        book_obj.authors.add(*[1,2])  # 插入作者的id 打散的形式插入
        
        # 方式2
        author1 = models.Author.objects.get(id=1)
        author2 = models.Author.objects.get(id=3)
        book_obj = models.Book.objects.get(nid=5)
        book_obj.authors.add(*[author1,author2])

         

      刪除數據

      一對一和一對多的刪除和單表刪除是一樣的
      # 一對一  表一外鍵關聯到表二,表一刪除,不影響表2,表2刪除會影響表1
      # 作者表外鍵關聯作者詳細信息表
      
      models.AuthorDetail.objects.get(id=2).delete() # 作者表會受影響
      models.Author.objects.get(id=3).delete()    # 作者詳細信息表不會影響
      
      # 一對多
      # 書籍表外鍵關聯出版社表
      
      models.Publish.objects.get(id=1).delete() # 書籍表會影響
      models.Book.objects.get(id=1).delete()    # 出版社表不會影響
      
      # 多對多關系刪除
      book_obj = models.Book.objects.get(nid=6)
      book_obj.authors.remove(6)  # 刪除書id為6和作者id為6的一行數據
      book_obj.authors.remove(*[5,6])
      
      book_obj.authors.clear()  # 清空表中所有數據
      
      book_obj.authors.set('1')  #刪除然后更新,后面寫字符串
      book_obj.authors.set(['5','6'])

       

       

      更新數據

      # 一對一
      models.Author.objects.filter(id=5).update(
          name='張三',
          age=16,
          authorDetail=models.AuthorDetail.objects.get(id=5),
          authorDetail_id=4,
      )
      
      #一對多
      models.Book.objects.filter(pk=4).update(     # pk=4等價于id=4
          title='白夜行',
          publishs=models.Publish.objects.get(id=3),
          publishs_id=3,
      )
      
      #一對多
      models.Publish.objects.filter(pk=2).update(
          id=4, # 沒有級聯更新,報錯!!
      )

       

       

      基于對象的跨表查詢

      • 類似于子查詢
      • 正向查詢和反向查詢: 關系屬性(字段)寫在哪個類(表)里面,從當前類(表)的數據去查詢它關聯類(表)的數據叫做正向查詢,反之叫做反向查詢

        

      ############## 一對一
      查詢Alex的電話號碼(正向查詢)
      obj = models.Author.objects.get(name='alex')
      print(obj.authorDetail.telephone)
      
      反向查詢: 查詢333這個號碼是誰的
      #obj = models.AuthorDetail.objects.filter(telephone='333').first().author.name
      obj = models.AuthorDetail.objects.get(telephone='333').author.name
      print(obj)
      
          '''        正向查詢: Authorobj.authorDetail,對象.關聯屬性名稱
              Author -----------------------------------> AuthorDetail
                     <-----------------------------------
                    反向查詢: AuthorDetailobj.author  ,對象.小寫類名
          '''
      
      ######### 一對多
      查詢追風箏的人是哪個出版社出版的(正向查詢)
      obj = models.Book.objects.get(title='追風箏的人')
      print(obj.publishs.name,obj.publishs.city)
      
      查看新華出版社出了什么書(反向查詢)
      obj = models.Publish.objects.get(name='人民出版社')
      for i in obj.book_set.all():   # 循環拿到具體的值
          print(i)
          
          '''   正向查詢 book_obj.publishs  對象.屬性
          Book ---------------------------------------------> Publish
              <----------------------------------------------
                反向查詢 publish_obj.book_set.all()  對象.表名小寫_set
          '''
          
      ########## 多對多
      查看狼道這本書是誰寫的(正向查詢)
      obj = models.Book.objects.get(title='狼道')
      for i in obj.authors.all():
          print(i)
      
      查詢張三寫過什么書(反向查詢)
      obj = models.Author.objects.get(name='張三')
      for i in obj.book_set.all():
          print(i)
          
          '''       正向查詢 book_obj.authors.all()  對象.屬性
              Book ---------------------------------------------> Author
                  <----------------------------------------------
                    反向查詢 author_obj.book_set.all()  對象.表名小寫_set
          '''
      View Code

       

       

       

      基于雙下劃線的跨表查詢

      • 類似于連表查詢
      • ########### 一對一
        查詢lisi的電話號碼(正向查詢)
        obj=models.Author.objects.filter(name='lisi')
        print(obj.values('authorDetail__telephone')[0]['authorDetail__telephone'])
        
        obj = models.AuthorDetail.objects.filter(author__name='lisi').values('telephone')
        print(obj)
        
        查詢333電話是誰的
        obj = models.AuthorDetail.objects.filter(telephone='333')
        print(obj.values('author__name'))
        
        obj = models.Author.objects.filter(authorDetail__telephone='333').values('name')
        print(obj)
        
        ################# 一對多
        查詢狼道是那個出版社出版的
        obj = models.Book.objects.filter(title='狼道').values('publishs__name')
        print(obj)
        
        obj = models.Publish.objects.filter(book__title='狼道').values('name')
        print(obj)
        
        查詢新華出版社出版了什么書
        obj = models.Publish.objects.filter(name='新華出版社').values('book__title')
        print(obj)
        
        obj = models.Book.objects.filter(publishs__name='新華出版社').values('title')
        print(obj)
        
        ################ 多對多
        解憂雜貨店這本書是誰寫的
        obj = models.Book.objects.filter(title='解憂雜貨店').values('authors__name')
        print(obj)
        
        obj = models.Author.objects.filter(book__title='解憂雜貨店').values('name')
        print(obj)
        
        alex寫了什么書
        obj= models.Author.objects.filter(name='alex').values('book__title')
        # print(obj)
        
        obj = models.Book.objects.filter(authors__name='alex').values('title')
        print(obj)
        
        ############### 進階的
        玄機出版社 出版的書名稱及作者的名稱
        obj = models.Publish.objects.filter(name='玄機出版                                社').values('book__title','book__authors__name')
        print(obj)
        
        obj = models.Book.objects.filter(publishs__name='玄機出版社').values('title','authors__name')
        print(obj)
        
        obj = models.Author.objects.filter(book__publishs__name='玄機出版社').values('name','book__title')
        print(obj)
        View Code

         

       

      posted @ 2019-07-28 21:13  未來&你好  閱讀(285)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 高清无码18| 国产精品午夜福利小视频| 精品综合久久久久久98| 一区二区三区久久精品国产| 精品一卡2卡三卡4卡乱码精品视频| 色爱区综合激情五月激情| 亚洲国产天堂久久综合226114| 日本午夜精品一区二区三区电影| 亚洲国产色婷婷久久99精品91| 欧美丰满妇大ass| 国产第一页浮力影院入口| 免费超爽大片黄| 久国产精品韩国三级视频| 文安县| 日韩精品国产中文字幕| 日本一区二区三区免费播放视频站 | 亚洲一区二区精品动漫| 天堂亚洲免费视频| 免费看的日韩精品黄色片| 亚洲精品麻豆一二三区| 亚洲综合区激情国产精品| 花式道具play高h文调教| 99久久激情国产精品| 日本japanese丰满白浆| 十八禁国产一区二区三区| 欧洲精品色在线观看| 亚洲AV无码国产成人久久强迫| 国产精品自拍一二三四区| 久久久亚洲欧洲日产国码αv| 国产毛片子一区二区三区| 欧洲一区二区中文字幕| 国内极度色诱视频网站| 人人妻人人澡人人爽人人精品av | 亚洲欧洲精品成人久久曰| a级国产乱理伦片在线观看al| 国产熟睡乱子伦视频在线播放| 在线精品国产中文字幕| 国产精品99久久免费| 人妻少妇精品视频二区| 综合色一色综合久久网| 免费无码一区无码东京热|