Python學習---ORM查詢之基於對象的正向/反向查詢

來源:互聯網
上載者:User

標籤:mod   均值   條件   queryset   預設   包含   實現   出版社   upd   

ORM查詢之 基於對象 的正向查詢與反向查詢

對象形式的查詢

# 正向查詢

    ret1=models.Book.objects.first()    print(ret1.title)    print(ret1.price)    print(ret1.publisher)    print(ret1.publisher.name)  # ret1.publisher是book屬性,是Publish對象,非queryset集合

# 反向尋找

ret2=models.Publish.objects.last()    print(ret2.name)    print(ret2.city)

#如何拿到與它綁定的Book對象呢?

    print(ret2.book_set.all())  # ret2.book_set是一個queryset集合,all()可以省略    print(ret2.book_set.all().values(‘title‘).distinct())  # 去重
ORM查詢之 基於條件 的正向查詢與反向查詢

單表條件查詢[雙底線實現表關聯]:使用逗號分隔可以實現and的條件查詢

#    models.Book.objects.filter(id__lt=10, id__gt=1)      # 擷取id大於1 且 小於10的值#    models.Book.objects.filter(id__in=[11, 22, 33])      # 擷取id等於11、22、33的資料#    models.Book.objects.exclude(id__notin=[11, 22, 33])  # not in#    models.Book.objects.filter(title__contains="Python") # 模糊比對#    models.Book.objects.filter(name__icontains="ven")    # icontains大小寫不敏感#    models.Book.objects.filter(id__range=[1,12])         # 範圍bettwen and#    startswith,istartswith, endswith, iendswith,        # 以XXX開始/XXX結束

多表條件關聯查詢[雙底線實現表關聯]

一對多[正向查詢]: 使用逗號分隔可以實現and的條件查詢,filter和values裡面均可使用雙底線

#  models.Book.objects.filter(title=‘Python‘,id=5).values(‘publish__name‘).distinct()      # [{‘publisher__city‘: ‘北京‘}]  publish__name這裡的Book裡面的publish屬性#  models.Book.objects.filter(publish__id=5).values(‘title‘).distinct()      # Book尋找出版社ID=5的書的名字#  models.Book.objects.filter(publish__id=5).values(‘publish_name‘).distinct()      # Book尋找出版社ID=5的出版社的名字

一對多[反向查詢]:使用逗號分隔可以實現and的條件查詢,filter和values裡面均可使用雙底線

#  models.Publish.objects.filter(book__title=‘Python‘,book_id=5).values(‘name‘) .distinct()      # [{‘name‘: ‘H出版社‘}] 尋找跟Publish相關的Book的內容,book__title中的book就是Publish的關聯表名

多對多[正向查詢]:使用逗號分隔可以實現and的條件查詢

#  models.Book.objects.filter(title=‘Python‘).values(‘author__name ‘) .distinct()  #  models.Book.objects.filter(author__name=‘FTL‘).values(‘title‘) .distinct()  

多對多[反向查詢]:使用逗號分隔可以實現and的條件查詢

 #  models.Author.objects.filter(book__title=‘Python‘).values(‘name‘) .distinct() 

注意:

1、正向尋找的book__title中的book是表名Book

2、正向尋找的publish__city或者author__name中的publish,author是book表中綁定的欄位【Book裡面的屬性】

3、一對多和多對多在這裡用法沒區別

ORM之彙總查詢與分組查詢

ORM之彙總查詢與分組查詢

彙總查詢: aggregate(*args,**kwargs): 可通過filter/Values過濾後彙總

通過對QuerySet進行計算,返回一個彙總值的字典。aggregate()中每一個參數都指定一個包含在字典中的傳回值[鍵的名稱是彙總值的標識符,值是計算出來的彙總值。鍵的名稱是按照欄位和彙總函式的名稱自動產生出來的],即在查詢集上產生彙總。

from django.db.models import Avg,Min,Sum,Max>>> Book.objects.all().aggregate(Avg(‘price‘)){‘price__avg‘: 34.35}     # 系統定義名稱>>> Book.objects.all().aggregate (average_price=Avg(‘price‘)){‘average_price‘: 34.35}     # 自訂了名稱>>> Book.objects.aggregate(Avg(‘price‘), Max(‘price‘), Min(‘price‘))  # 其他查詢

分組查詢: annotate(*args,**kwargs): 可通過filter/Values過濾後分組

可以通過計算查詢結果中每一個對象所關聯的對象集合,從而得出總計值(也可以是平均值或總和),即為查詢集的每一項產生彙總。

from django.db.models import Avg,Min,Sum,Max>>> Book.objects.values(‘author_name‘).annotate(Sum(‘price‘)) # 根據作者名分組後計算每個作者price
ORM之 F查詢與Q查詢

F查詢: 只能適用於IntegerFiled  【使用了F查詢,預設值是0】

from django.db.models import Fmodels.Book.objects.update(num=F(‘num‘) + 100)  

Q查詢:

from django.db.models import Q#1 Q對象(django.db.models.Q)可以對關鍵字參數進行封裝,從而更好地應用多個查詢    q1=models.Book.objects.filter(Q(title__startswith=‘P‘)).all()# 2、可以組合使用&,|操作符,當一個操作符是用於兩個Q的對象,它產生一個新的Q對象。    q2=models.Book.objects.filter(Q(name=‘HHH‘)|Q(name=‘FTL‘)).all()    # 3、Q對象可以用~操作符放在前面表示否定,也可允許否定與不否定形式的組合    Q(title__startswith=‘P‘) | ~Q(pub_date__year=2005)# 4、應用:    Book.objects.get(         Q(title__startswith=‘P‘) and        (Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))    )# 5、Q對象可以與關鍵字參數查詢一起使用,不過一定要把Q對象放在關鍵字參數查詢的前面。    # 正確:    Book.objects.get(        Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),        title__startswith=‘P‘)    # 錯誤:    Book.objects.get(        question__startswith=‘P‘,        Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))

Python學習---ORM查詢之基於對象的正向/反向查詢

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.