1. 程式人生 > 其它 >基於雙下劃線的跨表查詢

基於雙下劃線的跨表查詢

Django 還提供了一種直觀而高效的方式在查詢(lookups)中表示關聯關係,它能自動確認 SQL JOIN 聯絡。要做跨關係查詢,就使用兩個下劃線來連結模型(model)間關聯欄位的名稱,直到最終連結到你想要的model 為止。

'''
    正向查詢按欄位,反向查詢按表名小寫用來告訴ORM引擎join哪張表
'''

一對多查詢

# 練習:  查詢蘋果出版社出版過的所有書籍的名字與價格(一對多)

    # 正向查詢 按欄位:publish

    queryResult=Book.objects
            .filter(publish__name="蘋果出版社
")             .values_list("title","price") # 反向查詢 按表名:book queryResult=Publish.objects               .filter(name="蘋果出版社")               .values_list("book__title","book__price")

多對多查詢

# 練習: 查詢alex出過的所有書籍的名字(多對多)

    # 正向查詢 按欄位:authors:
    queryResult=Book.objects
            .filter(authors__name
="yuan")             .values_list("title") # 反向查詢 按表名:book queryResult=Author.objects               .filter(name="yuan")               .values_list("book__title","book__price")

一對一查詢

# 查詢alex的手機號
    
    # 正向查詢
    ret=Author.objects.filter(name="alex").values("authordetail__telephone")

    
# 反向查詢 ret=AuthorDetail.objects.filter(author__name="alex").values("telephone")

進階練習(連續跨表)

# 練習: 查詢人民出版社出版過的所有書籍的名字以及作者的姓名


    # 正向查詢
    queryResult=Book.objects
            .filter(publish__name="人民出版社")
            .values_list("title","authors__name")
    # 反向查詢
    queryResult=Publish.objects
              .filter(name="人民出版社")
              .values_list("book__title","book__authors__age","book__authors__name")


# 練習: 手機號以151開頭的作者出版過的所有書籍名稱以及出版社名稱
    # 方式1:
    queryResult=Book.objects
            .filter(authors__authorDetail__telephone__regex="151")
            .values_list("title","publish__name")
    # 方式2:    
    ret=Author.objects
              .filter(authordetail__telephone__startswith="151")
              .values("book__title","book__publish__name")

related_name

反向查詢時,如果定義了related_name ,則用related_name替換表名,例如:

    
publish = ForeignKey(Blog, related_name='bookList')
# 練習: 查詢人民出版社出版過的所有書籍的名字與價格(一對多)# 反向查詢 不再按表名:book,而是related_name:bookList
    queryResult=Publish.objects
              .filter(name="人民出版社")
              .values_list("bookList__title","bookList__price")