1. 程式人生 > 其它 >今日學習內容總結5.3

今日學習內容總結5.3

今日學習內容總結

雙下劃線查詢

引數介紹

引數 意義
__in 是否在
__gt 大於
__lt 小於
__gtr 大於等於
__lte 小於等於
__range 在...之間,閉區間
__contains 包含
__icontains 包含(忽略大小寫)
__startswith 以...開頭
__endswith 以...結尾
__year 取出年份
__month 取出月份
__day 取出日期
__hour 取出小時
__minute 取出分鐘
__second 取出秒
__week_day 一週的第幾天

使用方法

    # 查詢年齡大於20的使用者
    res = models.User.objects.filter(age__gt=20)  

    # 查詢年齡小於20的使用者
    res = models.User.objects.filter(age__lt=20)  

    # 查詢年齡大於等於20的使用者
    res = models.User.objects.filter(age__gte=20)

    # 查詢年齡小於等於20的使用者
    res = models.User.objects.filter(age__lte=20)

    # 查詢年齡是18,22,25的使用者
    res = models.User.objects.filter(age__in=[18,22,25])

    # 查詢年齡在18到26之間的使用者
    res = models.User.objects.filter(age__range=[18,26])

    # 查詢姓名中包含字母j的使用者(區分大小寫)
    res = models.User.objects.filter(name__contains='j')

    # 查詢姓名中包含字母j的使用者(忽略大小寫)
    res = models.User.objects.filter(name__icontains='j')

    # 查詢姓名中以字母j為開頭的使用者(區分大小寫)
    res = models.User.objects.filter(name__startswith='j')

    # 查詢姓名中以字母j為開頭的使用者(忽略大小寫)
    res = models.User.objects.filter(name__istartswith='j')

    # 查詢姓名中以字母j結尾的使用者
    res = models.User.objects.filter(name__endswith='j')

    # 查詢月份是5月的資料
    res = models.User.objects.filter(op_time__month=5)

    # 查詢年份是22年的資料
    res = models.User.objects.filter(op_time__year=2022)

外來鍵欄位的建立

ForeignKey 一對多

      django orm外來鍵欄位針對一對多關係也是建在多的一方。

    # 設定要關聯的表,自動關聯主鍵
      to

    # 自己設定要關聯的表的欄位
      to_field\ti_fields

    # 基於物件反向操作時,使用的欄位名,用於代替原反向查詢是的'表名小寫_set',不建議使用
      related_name

    # 基於連表反向查詢時使用的連線字首,用於替換表名
      related_query_name

    # 當刪除關聯表中的資料時,當前表與其關聯的行的行為
      on_delete

    # 是否在資料庫中建立外來鍵約束,預設為True。可以設定為False
      db_constraint

      on_delete引數值(1.x版本預設新增該引數, 2.x以後必須加上, 否則報錯)。

    # 例:on_delete=models.CASCADE

    models.CASCADE
    # 刪除關聯資料,與之關聯也刪除

    models.DO_NOTHING
    # 刪除關聯資料,什麼都不做

    models.PROTECT
    # 刪除關聯資料,引發錯誤ProtectedError

    models.SET_NULL
    # 刪除關聯資料,與之關聯的值設定為null(前提FK欄位需要設定為可空)

    models.SET_DEFAULT
    # 刪除關聯資料,與之關聯的值設定為預設值(前提FK欄位需要設定預設值)

    models.SET
    # 刪除關聯資料
    a. 與之關聯的值設定為指定值,設定:models.SET(值)
    b. 與之關聯的值設定為可執行物件的返回值,設定:models.SET(可執行物件)

ManyToManyField 多對多

      django orm外來鍵欄位針對多對多關係 可以不用自己建立第三張表。

    to
    # 設定要關聯的表

    to_field
    # 設定要關聯的表的欄位

    related_query_name
    # 反向查詢操作時,使用的連線字首,用於替換表名

    symmetrical
    # 僅用於多對多自關聯時,指定內部是否建立反向操作的欄位, 預設為True

    through
    # 手動建立第三張表,指定通過哪個表

    through_fields
    # 設定關聯的欄位

    db_table
    # 預設建立第三張表時,資料庫中表的名稱

OneToOneField 一對一

      django orm外來鍵欄位針對一對一關係 建在查詢頻率較高的表中

    to
    # 設定要關聯的表

    to_field
    # 設定要關聯的表的欄位

    on_delete
    # 同ForeignKey欄位

外來鍵欄位操作

      一對多、一對一外來鍵欄位操作

  新增資料
  models.Book.objects.create(title='聊齋志異', price=16987.22, publish_id=1)  # 直接填寫關聯資料的主鍵值			
		
  publish_obj = models.Publish.objects.filter(pk=2).first()
  models.Book.objects.create(title='資本論', price=56777.98, publish=publish_obj)  
  修改關係欄位
  models.Book.objects.filter(pk=1).update(publish_id=3)
  
  publish_obj = models.Publish.objects.filter(pk=2).first()
  models.Book.objects.filter(pk=1).update(publish=publish_obj)
 

      多對多欄位操作

      1.第三張關係表建立資料

    book_obj = models.Book.objects.filter(pk=1).first()
    book_obj.authors.add()

      括號內可以放主鍵值也可以放資料物件,並且都支援多個。

      2.第三張關係表修改資料

    book_obj.authors.set()

      括號內必須是一個可迭代物件,元素同樣支援主鍵值或者資料物件。

      3.第三張關係表刪除資料

    book_obj.authors.remove()

      括號內可以放主鍵值也可以放資料物件,並且都支援多個。

      4.第三張關係表清空指定資料

    book_obj.authors.clear()

      括號內無需傳值,直接清空當前表在第三張關係表中的繫結記錄。

多表查詢

正向查詢

    1. 正向查詢按欄位

    2. 正向:外來鍵欄位在的一方查不在的一方

    3. 如果返回結果多個還需要.all()

反向查詢

    1. 反向查詢按表名小寫

    2. 反向:外來鍵欄位不在的一方查在的一方

    3. 如果返回結果多個還需要連線_set.all()

基於物件的跨表查詢

      基於物件的跨表查詢本質就是子查詢即分步操作即可。

  # 1.查詢資料分析書籍對應的出版社
    # 先獲取書籍物件
      book_obj = models.Book.objects,filter(title='資料分析').first()
    # 再使用跨表查詢
      res = book_obj.publish
      print(res)

  # 2.查詢python全棧開發對應的作者
    # 先個獲取書籍物件
      book_obj = models.Book.objects.filter(title='python全棧').first()
    # 再跨表
      res = book_obj.authors.all()  # 因為結果 為多個,如果不加all:app01.Author.None
      print(res)

  # 3.查詢作者jason的詳細資訊
      author_obj = models.Author.objects.filter(name='jason').first()
      res = authors_obj.author_detail
      print(res)

  # 4.查詢東方出版社出版的書籍
      publish_obj = models.Publish.objects.filter(name='東方出版社').first()
      res = publish_obj.book_set_all()
      print(res)

  # 5.查詢jason編寫的書籍
      author_obj = models.Author.objects.filter(name='jason').first()
      res = author_obj.book_set.all()
      print(res)

  # 6.查詢電話是110的作者
      author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
      res = author_detail_obj.author
      print(res)

基於雙下劃線的跨表查詢

      基於雙下劃線的跨表查詢本質就是連表操作。

  # 1.查詢資料分析書籍對應的出版社名稱以及出版地址
    res = models.Book.objects.filter(title='資料分析').values('publish_name', 'publish_addr')
    print(res)

  # 2.查詢python全棧開發對應的作者姓名和年齡
    res = models.Book.objects.filter(title='python全棧開發').values('authors_name', 'authors_age')
    print(res)

  # 3. 查詢作者jason的手機號和地址
    res = models.Author.objects.filter(name='jason').values('author_detail_phone', 'author_datail_addr')
    print(res)

  # 4.查詢東方出版社出版的書籍名稱和價格
    res = models.Publish.objects.filter(name='東方出版社').values('book_title', 'book_price')
    print(res)

  # 5.查詢jason編寫的書籍名稱和日期
    res = models.Author.objects.filter(name='jason').values('book_title', 'book_publish_time')
    print(res)

  # 6.查詢電話是110的作者的姓名和年齡
    res = models.AuthorDetail.objects.filter(phone=110).values('author_name', 'author_age')

雙下線查詢擴充套件

      基於雙下劃線的跨表查詢的結果也可以是完整的資料物件。

      手上有條件所在的表可以不被models點,直接點最終的目標資料對應的表。

  # 1.查詢資料分析書籍對應的出版社名稱
    res = models.Publish.objects.filter(book__title='資料分析').values('name')
    print(res)

  # 2.查詢python全棧開發對應的作者姓名和年齡
    res = models.Author.objects.filter(book_title='python全棧開發').values('name', 'age')

  # 3.查詢作者jason的手機號和地址
    res = models.AuthorDetail.objects.filter(author_name='jason').values('phone', 'addr')

  # 4.查詢東方出版社出版的書籍名稱和價格
    res = models.Book.objects.filter(publish_name='東方出版社').values('title', 'price')

  # 5.查詢jason編寫的書籍名稱和日期
    res = models.Book.objects.filter(author_name='jason').values('title', 'publish_time')

  # 6.查詢電話是110的作者的姓名和年齡
    res = models.Author.objects.filter(author_detail_phone=110).values('name', 'age')

  # 連續跨表操作
  # 查詢python全棧開發對應的作者的手機號
    res = models.Book.objects.filter(title='python全棧開發').values('authors_author_detail_phone')

如何檢視SQL語句

    1. 如果結果集物件是queryset 那麼可以直接點query檢視

    2. 配置檔案固定配置
  	適用面更廣 只要執行了orm操作 都會列印內部SQL語句