1. 程式人生 > 其它 >Django外來鍵欄位的增刪改查&跨表查詢

Django外來鍵欄位的增刪改查&跨表查詢

內容概要

  • 外來鍵欄位的增刪改查
  • 正反向查詢的概念
  • 基於物件的跨表查詢
  • 基於雙下劃線的跨表查詢(連表操作)
  • F與Q查詢

內容詳細

外來鍵欄位的增刪改查

        # 前期資料表準備
        # 以圖書 出版社 作者 作者詳情表為例
        # 1. 針對一對多,一對一
            # 增加資料,增加一本書
            # models.Book.objects.create(title='西遊記', price=100, publish_time='2022-02-01', publish_id=1)
            # 先查詢出你要新增的出版社物件

            # publish_obj = models.Publish.objects.filter(pk=2).first()
            # models.Book.objects.create(title='西遊記1', price=100, publish_time='2022-02-01', publish=publish_obj)

            # 第二種方式
            # book_obj = models.Publish.objects.filter(pk=2).first()
            # book_obj.publish.add(1)
            # 2. 改
            # models.Book.objects.filter(pk=1).update(publish_id=2)
            # book_obj = models.Book.objects.filter(pk=1).first()
            # print(book_obj.publish) #
            # publish_obj = models.Publish.objects.filter(pk=1).first()
            # models.Book.objects.filter(pk=1).update(publish=publish_obj)

            # 針對多對多
            # 給一本書新增多個作者
            # book_obj =  models.Book.objects.filter(pk=1).first()
            # print(book_obj.authors)  # app01.Author.None
            # print(book_obj.authors.all())  # app01.Author.None
            # 增加
            # book_obj.authors  # 代表已經到第三張表了
            # book_obj.authors.add(1)

            # 支援物件
            # author_obj1 = models.Author.objects.filter(pk=1).first()
            # author_obj2 = models.Author.objects.filter(pk=2).first()
            # book_obj.authors.add(1, 2)
            # book_obj.authors.add(author_obj1, author_obj2)

            # 改
            # book_obj.authors.set([3, 2])
            # book_obj.authors.set([author_obj1, author_obj2])

            # 刪除
            # book_obj.authors.remove(2)

            # 清空
            # book_obj.authors.clear() 

正反向查詢

        正向查詢
        反向查詢
            '''
                外來鍵欄位在我手上,我查你就是正向
                外來鍵欄位不再我手上,我查你就是反向
            '''
        eg:
            book     >>>  publish   # 正向
            publish  >>>  book      # 反向
            author   >>>  book      # 反向
            book     >>>  author    # 正向

         在多表查詢的時候,按照正反向查詢口訣
        '''
            1. 正向查詢按照欄位(外來鍵欄位)
            2. 反向查詢按照表名小寫或者表名小寫_set.all()
        '''

基於物件的跨表查詢

        ###############################跨表查詢###########################################
            # 1.
            # 查詢書籍主鍵為1的出版社
            # 書 >>> 出版社  >>> 正向
            # book_obj = models.Book.objects.filter(pk=1).first()
            # print(book_obj)
            # print(book_obj.publish)  # 代表的是出版社物件
            # print(book_obj.publish.name)
            # print(book_obj.publish.addr)

            # 2.
            # 查詢書籍主鍵位1的作者
            # book >>> author >>> 正向
            # book_obj = models.Book.objects.filter(pk=1).first()
            # print(book_obj.authors)  # app01.Author.None
            # print(book_obj.authors.all())  # app01.Author.None
            # for author_obj in book_obj.authors.all():
            #     print(author_obj.name)

            # 3.
            # 查詢tom的手機號
            # 作者 >>> 作者詳情 >>> 正向
            # author_obj = models.Author.objects.filter(name='tom').first()
            # print(author_obj.author_detail)
            # print(author_obj.author_detail.phone)

            # 4.
            # 查詢東京出版社出版的書籍
            # 出版社查書 >>> 反向
            # publish_obj = models.Publish.objects.filter(name='東京出版社').first()
            # print(publish_obj.book_set)  # app01.Book.None
            # print(publish_obj.book_set.all())  # app01.Book.None
            # for book_obj in publish_obj.book_set.all():
            #     print(book_obj.title)

            # 5.
            # 查詢tom寫過的書
            # 作者查書  >>> 反向
            author_obj = models.Author.objects.filter(name='tom').first()
            print(author_obj.book_set.all())

            # 6.
            # 查詢手機號是120的作者姓名
            # 作者詳情查作者資訊  >>> 反向
            author_detail_obj = models.AuthorDetail.objects.filter(phone=120).first()
            print(author_detail_obj.author) # 

            '''
                總結:
                    反向查詢只要查詢出的結果可能有多個的時候,都要加上 表名_set.all()
                    如果查詢出來的結果是一個,就不用加_set,直接使用表名小寫

            '''

基於雙下劃線的跨表查詢


            # 1.
            # 查詢書籍主鍵為1的出版社名稱和書籍名稱
            '''
                正反向查詢的概念同樣適用
            '''
            # res = models.Book.objects.filter(pk=1).values('title', 'publish__name')
            # print(res)


            # 2.
            # 查詢書籍主鍵位1的作者名稱
            # res = models.Book.objects.filter(pk=1).values('authors__name')
            # print(res)

            # 3.
            # 查詢tom的手機號
            # res = models.Author.objects.filter(name='tom').values('author_detail__phone')
            # print(res)

            # 4.
            # 查詢東京出版社出版的書籍
            # res = models.Publish.objects.filter(name='東京出版社').values('book__title')
            # print(res)

            # 5.
            # 查詢tom寫過的書
            # res = models.Author.objects.filter(name='tom').values('book__title')
            # print(res)

            # 6.
            # 查詢手機號是120的作者姓名
            # res = models.AuthorDetail.objects.filter(phone=120).values('author__name')
            # print(res)

            # 7.
            # 查詢書籍主鍵位1的作者的手機號
            # book   author   author_detail
            res = models.Book.objects.filter(pk=1).values('authors__author_detail__phone')
            print(res)

F查詢與Q查詢

        # F查詢
        可以拿到資料庫中原有的資料
        # 1. 把書籍的價格在原來的基礎之上加100元
        book
        update book set price = price + 100 where id=1;

        # F查詢
            # 1. 把書籍的價格在原來的基礎之上加100元
            '''
                一般來說,跟資料相關的模組要麼在django.db,要麼在django.db.models

            '''
            from django.db.models import  F
            ''' F查詢預設是對數字型別的'''
            # models.Book.objects.update(price=F('price')+100)

            from django.db.models.functions import Concat
            from django.db.models import Value
            # 2.
            # models.Book.objects.update(title=Concat(F('title'), Value('東京出版社')))

            # Q查詢
            # 1. 查詢書籍價格大於等於300的或者id=1的資料
            # sql: select * from t where price >= 300 or id=1
            # orm:
            from django.db.models import Q
            # res=models.Book.objects.filter(Q(price__gte=300), Q(id=1)) # 逗號分隔,還是and關係
            # res=models.Book.objects.filter(Q(price__gte=300)| Q(id=1)) # |分隔,還是or關係
            # res=models.Book.objects.filter(~Q(price__gte=300)| ~Q(id=1)) # ~分隔,取反
            # print(res)
            # q = 'price'