Django單表,連表查詢



今日內容:
 模型層(orm模型表)
 數據庫
 記錄
 
 
 1,在djang中新增測試腳本
  1,可以在根目錄下新建一個py文件。列如test.py文件
  2,在文件中寫入以下代碼即可
  
  #!/usr/bin/env python
  import os
  import sys
  if __name__ == "__main__":
   os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day55.settings")
   import django
   django.setup()
 2,單表操作
  1,表的字段增刪改查
  2,記錄的增刪改查
  
  
 3,神奇的雙下滑查詢
   """
   查看orm內部sql語句的方法有哪些
    1.如果是queryset對象 那么可以點query直接查看該queryset的內部sql語句
    2.在django項目的配置文件中 配置一下參數即可實現所有的orm在查詢的時候自動打印對應的sql語句
    LOGGING = {
     'version': 1,
     'disable_existing_loggers': False,
     'handlers': {
      'console':{
       'level':'DEBUG',
       'class':'logging.StreamHandler',
      },
     },
     'loggers': {
      'django.db.backends': {
       'handlers': ['console'],
       'propagate': True,
       'level':'DEBUG',
      },
     }
    }
   """
  
  
  
  
  
  4連表查詢:
   1,一對多字段的增刪改查
    增
     
     1,傳數字,
      用外鍵關聯字段時,直接傳數字,即關聯的id值就可以 例如 publish_id=1
      models.Book.objects.create(title='三國演義',price=899.99,publish_id=1)
     
     2,傳對象,
      當不是外鍵字段時,如果用publish= 這時候傳的是對象
      是去找與之關聯表中的虛擬字段查找對象,然后把對象當做參數傳
     
         # publish_obj = models.Publish.objects.filter(pk=2).first()
      # book_obj = models.Book.objects.create(title='西游記',price=666.99,publish=publish_obj)
        #改
      *************
      同增原理一樣:如果是實際的字段就傳數字
          如果是虛擬的字段就傳對象
         
      #傳數字
      # models.Book.objects.filter(pk=5).update(publish_id=3)
      #傳對象
      publish_obj = models.Publish.objects.filter(pk=2).first()
      models.Book.objects.filter(pk=7).update(publish=publish_obj)
    
     #刪
      #在django的orm中默認的是級聯更新,級聯刪除,
      # 關聯表中增加數據,刪除數據,被關聯表也會隨之發送改變
      
      models.Publish.objects.filter(pk=2).delete()
    
   2,多對多字段的增刪改查
     add()       增    傳數字,對象
     set()        改   傳數字,對象  ,必須是可迭代對象
     remove()     刪    傳數字,對象
        以上可以傳多個
     clear()      刪所有   括號內不要傳參數
   
     # 增
      add()
      1,add括號中傳數字
      
      
          # 主鍵為6的書籍增加一個作者
        book_obj = models.Book.objects.filter(pk=6).first()
        print(book_obj.authors) 此時為None,就是跳到了第三張表
        
        #對象點擊多對多虛擬字段時,會直接多對多的第三張表
        #此時book_obj.authors就是直接跨到第三張表
        book_obj.authors.add(1)  # 此時就是給id為6的書籍添加一個作者
        book_obj.authors.add(2,3)
        # add括號中既可以傳一個數字,又可以傳多個數字
        # 括號中一個數字,此時就是給id為6的書籍添加一個作者,
        # 所以括號中有幾個數字,就是添加幾個作者,數字表示的是作者的id號
      
      2,add括號中傳對象
        增加一條
            book_obj = models.Book.objects.filter(pk=4).first()
         aut_obj = models.Author.objects.filter(pk=3).first()
         book_obj.authors.add(aut_obj)
        
        增加多條
        
         book_obj = models.Book.objects.filter(pk=5).first()
         book_obj1= models.Book.objects.filter(pk=5).first()
         
         aut_obj = models.Author.objects.filter(pk=2).first()
         aut_obj1= models.Author.objects.filter(pk=1).first()
         aut_obj2 = models.Author.objects.filter(pk=9).first()
         
         book_obj.authors.add(aut_obj,aut_obj1,aut_obj2)
         book_obj1.authors.add(aut_obj1)
        總結:
        add是給書籍添加作者 括號內既可以傳數字也可以傳作者對象
        並且支持一次性傳多個 逗號隔開就可以
        注意 :對象點虛擬字段就是跳到了第三張表
        
        
     改:
      將主鍵為5的書籍對象 作者修改為2,3
      set()
       括號中以列表的形式,是可迭代對象才可以傳一個參數也要以列表的形式
       1,傳數字,
       
           book_obj = models.Book.objects.filter(pk=5).first()
        book_obj.authors.set([5,])   傳一個參數
        book_obj.authors.set([2,3])  傳多個參數
         本質就是修改,有點類似於刪除,把不要的刪除,把要的留下來
      
       2,傳作者對象
       
         aut_obj = models.Author.objects.filter(pk=2).first()
         aut_obj1= models.Author.objects.filter(pk=1).first()
         aut_obj2 = models.Author.objects.filter(pk=9).first()
         
         book_obj.authors.set([aut_obj,aut_obj1,aut_obj2])
   
      總結:
       set()括號內 需要傳一個可迭代對象
       可迭代對象  可以是多個數字組合
       也可以是多個對象組合
       但是不能混在一起使用,即不能既有數字,又有對象!!!
       要么純數字,要么純對象
       
       
       
     刪:
      remove()
       1,傳數字
       
          book_obj = models.Book.objects.filter(pk=5).first()
  
       book_obj.authors.remove(3)
       
       2,傳對象
       
        aut_obj = models.Author.objects.filter(pk=2).first()
        aut_obj1= models.Author.objects.filter(pk=1).first()
        aut_obj2 = models.Author.objects.filter(pk=9).first()
        
        book_obj.authors.remove(aut_obj)
        book_obj.authors.remove(aut_obj,aut_obj1,aut_obj2)
      總結:
       remove()括號內既可以傳數字 也可以傳對象
       並且支持傳多個,逗號隔開即可
       
       將某本書和作者的關系全部清空,用clear()
       即清空當前這個作者與書籍的關系
       
       book_obj = models.Book.objects.filter(pk=5).first()
       book_obj.authors.clear()
       
       
    跨表查詢:
            正向與反向的概念
   
       # 一對一
       # 正向:author---關聯字段在author表里--->authordetail  按字段
       # 反向:authordetail---關聯字段在author表里--->author  按表名小寫
       
        
       # 一對多
       # 正向:book---關聯字段在book表里--->publish  按字段
       # 反向:publish---關聯字段在book表里--->book  按表名小寫_set.all() 因為一個出版社對應着多個圖書
       
       # 多對多
       # 正向:book---關聯字段在book表里--->author  按字段
       # 反向:author---關聯字段在book表里--->book  按表名小寫_set.all() 因為一個作者對應着多個圖書
       
       
       正向查詢按外鍵字段
       反向查詢按表名小寫
       
       基於對象的跨表查詢(子查詢:將一張表的查詢結果當做另外一個查詢語句的條件)
       
       強調:在書寫orm語句的時候 跟寫sql語句一樣
       不要嘗試着 一次性寫完  應該做到寫一點看一點再一點
   1,如果外鍵字段在你當前這張表中,那么如果由你當前這張表向另一張表查詢就是正向
    關系字段在你當前這張表,由你這張表去查,正向
    關系字段不在你當前這張表,由你這張表去查,反向
    
    正向查詢按外鍵字段
    反向查詢按表名小寫
    
    
    # 基於對象的跨表查詢(子查詢:將一張表的查詢結果當做另外一個查詢語句的條件)
     #查詢書籍為4的出版社名稱
     book_obj = models.Book.objects.filter(pk=4).first()
     print(book_obj.publish.name)
     print(book_obj.publish.addr)
     # 查詢書籍id是5的作者姓名
     book_obj = models.Book.objects.filter(pk=5).first()
     
     print(book_obj.authors)   # app01.Author.None
     #書籍有多個作者,所以拿到為None
     print(book_obj.authors.all()) 拿到的是對象,
     
     當你外鍵字段對應的值有多個的時候就用all(),為一個的時候就不用all()
       
        # 查詢作者是jason的家庭住址
      auth_obj = models.Author.objects.filter(name='jason').first()
      print(auth_obj.author_detail.addr)
     
      
     反向查詢:
          # 查詢出版社是東方出版社出版的書籍
       publish_obj = models.Publish.objects.filter(name='東方出版社').first()
       print(publish_obj.book_set.all())
       # 查詢作者是jason寫過的所有書籍
       # auth_obj = models.Author.objects.filter(name='jason').first()
       # print(auth_obj.book_set)
       # print(auth_obj.book_set.all())
       
       # 查詢作者號碼是120的作者姓名
       auth_obj = models.AuthorDetail.objects.filter(phone=120).first()
       print(auth_obj.author.name)
       print(auth_obj.author.age)
       
     總結:
      反向查詢,當你反向查詢的結果是多個的時候就需要加 _set
              當你反向查詢的結果是一個時就不需要加_set
        即表名小寫即可
       跨表查詢:可以連續的查詢
       
       
  # 基於雙下划線的跨表查詢(其實就是連表操作)
     # 查詢jason作者的手機號
     res = models.Author.objects.filter(name='jason').values('author_detail__phone')
     #點values就是拿某張表中的某個字段,在判斷是正向還是反向,正向放字段,
     # 此時就是跨到了此表中,然后查此表字段就用__加字段名
     
         # 反向
      # res1 = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__age')
      # print(res1)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM