django初步瞭解4

django單表查詢

必知必會13條

1.all() 查詢全部 QuerySetpython

res=models.Book.objects.all()#惰性查詢
print(res)
for i in res:
    print(i.title)

2.filter() 查詢指定範圍 QuerySetdjango

res=models.Book.objects.filter(pk=3)
print(res)

3.get() 查詢單個對象,如有多個數據會報錯,不建議使用app

res=models.Book.objects.get(pk=2)
print(res.title)

4.first() 拿第一個code

res=models.Book.objects.filter(pk=2).first()
print(res)

5.last() 拿最後一個對象

res=models.Book.objects.filter(pk=1).last()
print(res)

6.exclude() 除此以外 QuerySet排序

res = models.Book.objects.exclude(pk=3).filter(pk=4).filter(pk=4)
print(res)

7.values() 查出全部的title以列表套字典形式 QuerySetrem

res=models.Book.objects.values('title')
print(res)
for r in res:
    print(r.get('title'))

8.values_list() QuerySet 同上列表套元組get

res = models.Book.objects.values_list('title')
print(res)

9.count() 統計個數it

res=models=Book.objects.all().count()
print(res)

10.distinct() 去重(必須是數據全同樣才能去重,包括主鍵)入門

res=models.Book.objects.all().distinct()
res1=models.Book.objects.values('title').distinct()
print(res,res1)

11.order_by() 排序默認升序

res=models.Book.objects.order_by('price')
#res=models.Book.objects.order_by('-price')#倒序的一種方式
print(res)

12.reverse() 必須是已經排序好的才能夠反轉

res=models.Book.objects.order_by('price').reverse()
print(res)

13.exists() 是否爲空,返回布爾值

res=modles.Book.objects.all().exists()
print(res)

雙下劃線查詢來咯

查詢價格大於200的書籍

res=models.Book.objects.filter(price__gt=200)

查詢價格小於200的書籍

res = models.Book.objects.filter(price__lt=200)

查詢價格大於或者等於200的書籍

res = models.Book.objects.filter(price__gte=200)

價格是200或者123.23或者666.66的

res = models.Book.objects.filter(price__in=[200,123.23,666.66])

價格在200到700之間的

res = models.Book.objects.filter(price__range=(200,700))

模糊匹配

like % _

查詢書籍名稱中包含p的

res =models.Book.objects.filter(title__contains='p')#區分大小寫
res =models.Book.objects.filter(title__icontains='p')#不分大小寫

查詢以三開頭的書籍

res = models.Book.objects.filter(title__startswith='三')
res1 = models.Book.objects.filter(title__endswith='P')
print(res1)

查詢某年某月的書籍

res = models.Book.objects.filter(publish_date__year='2019')
res = models.Book.objects.filter(publish_date__month='10')

多表操做

一對多增刪改查

#傳publish_id時傳id值
models.Book.objects.create(title='三國演義',price=123.23,publish_id=1)
#若傳publish則傳publish對象
publish_obj=models.Book.objects.filter(pk=1).first()
models.Book.objects.create(title='三國演義',price=123.23,publish=publish_obj)

book_obj = models.Book.objects.filter(pk=1).first()
print(book_obj.publish)  # 獲取到當前所對應的出版社對象
print(book_obj.publish_id)  # 獲取到的就是表中的實際字段

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)

models.Publish.objects.filter(pk=2).delete()
默認也是級聯更新 級聯刪除

多對多增刪改查(操做的都是第三張表)

增add

book_obj=models.Book.objects.filter(pk=3).first()
print(book_obj.authors)
book_obj.authors.add(1,2)

author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
# book_obj.authors.add(author_obj)
book_obj.authors.add(author_obj,author_obj1)
    """
    add() 括號內既能夠傳數字也能夠傳數據對象
    而且都支持傳多個
    """

改set

book_obj = models.Book.objects.filter(pk=3).first()
# book_obj.authors.set([3,])
# book_obj.authors.set([1,3])
author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
book_obj.authors.set((author_obj,))
book_obj.authors.set((author_obj,author_obj1))
    """
    set() 括號內 既能夠傳數字也傳對象 
    而且也是支持傳多個的
    可是須要注意 括號內必須是一個可迭代對象
    """

刪remover

book_obj = models.Book.objects.filter(pk=3).first()
# book_obj.authors.remove(2)
# book_obj.authors.remove(1,2)

author_obj = models.Author.objects.filter(pk=1).first()
author_obj1 = models.Author.objects.filter(pk=2).first()
# book_obj.authors.remove(author_obj)
book_obj.authors.remove(author_obj,author_obj1)
"""
    remove() 括號內 既能夠傳數字也傳對象 
    而且也是支持傳多個的
"""

清空clear

book_obj = models.Book.objects.filter(pk=3).first()
book_obj.authors.clear()
"""clear()括號內不須要傳任何參數 直接清空當前書籍對象全部的記錄"""

跨表查詢

"""
ORM跨表查詢
    1.子查詢
    2.連表查詢
    
正反向的概念
    外鍵字段在誰那兒 由誰查誰就是正向
    
    誰手裏有外鍵字段 誰就是正向查
    沒有外鍵字段的就是反向
    書籍對象 查  出版社    外鍵字段在書籍       正向查詢
    出版社 查 書籍         外鍵字段在書籍       反向查詢
    
    
    正向查詢按字段
    反向查詢按表名小寫 ...
    
"""
"""
# 1.基於對象的跨表查詢    子查詢
# 1.查詢書籍是python入門的出版社名稱
book_obj = models.Book.objects.filter(title='python入門').first()
# 正向查詢按字段
print(book_obj.publish.name)
print(book_obj.publish.addr)
# 2.查詢書籍主鍵是6的做者姓名
book_obj = models.Book.objects.filter(pk=6).first()
# print(book_obj.authors)  # app01.Author.None
print(book_obj.authors.all())
# 3.查詢做者是jason的手機號
author_obj = models.Author.objects.filter(name='jason').first()
print(author_obj.author_detail.phone)
print(author_obj.author_detail.addr)
"""
正向查詢 按字段 
當該字段所對應的數據有多個的時候 須要加.all()
否者點外鍵字段直接就可以拿到數據對象
"""
# 4.查詢出版社是東方出版社出版過的書籍
publish_obj = models.Publish.objects.filter(name='東方出版社').first()
# print(publish_obj.book_set)  # app01.Book.None
print(publish_obj.book_set.all())
# 5.查詢做者是jason寫過的全部的書
author_obj = models.Author.objects.filter(name='jason').first()
# print(author_obj.book_set)  # app01.Book.None
print(author_obj.book_set.all())
# 6.查詢手機號是110的做者
author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
print(author_detail_obj.author)
print(author_detail_obj.author.name)
print(author_detail_obj.author.age)
"""
反向查詢按表名小寫 
    何時須要加_set
        當查詢的結果能夠是多個的狀況下 須要加_set.all()
    何時不須要加_set
        當查詢的結果有且只有一個的狀況下 不須要加任何東西 直接表名小寫便可
"""
# 7.查詢書籍是python入門的做者的手機號
book_obj = models.Book.objects.filter(title='python入門').first()
print(book_obj.authors.all())
相關文章
相關標籤/搜索