1. 程式人生 > 實用技巧 >orm單表查詢

orm單表查詢

單表簡單查詢

<1> all():                  查詢所有結果,結果是queryset型別
  
<2> filter(**kwargs):       它包含了與所給篩選條件相匹配的物件,結果也是queryset型別 Book.objects.filter(title='linux',price=100) #裡面的多個條件用逗號分開,並且這幾個條件必須都成立,是and的關係,or關係的我們後面再學,直接在這裡寫是搞不定or的
	models.Student.objects.filter(id=7,name='大壯哥哥',age=78).update(
        name='大壯禪師',
        age=78
    )
    #打傘形式傳參
    models.Student.objects.filter(**{'id':7,'name':'大壯禪師'}).update(age=100)
  	models.Student.objects.all().filter(id=7)  queryset型別可以呼叫fitler在過濾
  
<3> get(**kwargs):          返回與所給篩選條件相匹配的物件,不是queryset型別,是行記錄物件,返回結果有且只有一個,
                            如果符合篩選條件的物件超過一個或者沒有都會丟擲錯誤。捕獲異常try。  Book.objects.get(id=1)
  
<4> exclude(**kwargs):      排除的意思,它包含了與所給篩選條件不匹配的物件,沒有不等於的操作昂,用這個exclude,返回值是queryset型別 Book.objects.exclude(id=6),返回id不等於6的所有的物件,或者在queryset基礎上呼叫,Book.objects.all().exclude(id=6)
    # exclude(**kwargs): 排除,objects控制器和queryset集合都可以呼叫,返回結果是queryset型別
    # query = models.Student.objects.exclude(id=1)
    # print(query)
    # query = models.Student.objects.filter(age=38).exclude(id=6)
    # print(query)
                 
<5> order_by(*field):       queryset型別的資料來呼叫,對查詢結果排序,預設是按照id來升序排列的,返回值還是queryset型別
                  models.Book.objects.all().order_by('price','id') #直接寫price,預設是按照price升序排列,按照欄位降序排列,就寫個負號就行了order_by('-price'),order_by('price','id')是多條件排序,按照price進行升序,price相同的資料,按照id進行升序
        
        
<6> reverse():              queryset型別的資料來呼叫,對查詢結果反向排序,返回值還是queryset型別
			# 排序之後反轉
  		    # query = models.Student.objects.all().order_by('id').reverse()
    		# print(query)

<7> count():                queryset型別的資料來呼叫,返回資料庫中匹配查詢(QuerySet)的物件數量。
  
<8> first():                queryset型別的資料來呼叫,返回第一條記錄 Book.objects.all()[0] = Book.objects.all().first(),得到的都是model物件,不是queryset
  
<9> last():                queryset型別的資料來呼叫,返回最後一條記錄,結果為model物件型別
  
<10> exists():              queryset型別的資料來呼叫,如果QuerySet包含資料,就返回True,否則返回False
                   空的queryset型別資料也有布林值True和False,但是一般不用它來判斷資料庫裡面是不是有資料,如果有大量的資料,你用它來判斷,那麼就需要查詢出所有的資料,效率太差了,用count或者exits
                 例:all_books = models.Book.objects.all().exists() #翻譯成的sql是SELECT (1) AS `a` FROM `app01_book` LIMIT 1,就是通過limit 1,取一條來看看是不是有資料

<11> values(*field):        用的比較多,queryset型別的資料來呼叫,返回一個ValueQuerySet——一個特殊的QuerySet,執行後得到的並不是一系列
                            model的例項化物件,而是一個可迭代的字典序列,只要是返回的queryset型別,就可以繼續鏈式呼叫queryset型別的其他的查詢方法,其他方法也是一樣的。
<12> values_list(*field):   它與values()非常相似,它返回的是一個元組序列,values返回的是一個字典序列
 
<13> distinct():            values和values_list得到的queryset型別的資料來呼叫,從返回結果中剔除重複紀錄,結果還是queryset
	query = models.Student.objects.all().values('age').distinct()
    print(query)
	
	

基於雙下劃線的模糊查詢

Book.objects.filter(price__in=[100,200,300]) #price值等於這三個裡面的任意一個的物件
Book.objects.filter(price__gt=100)  #大於,大於等於是price__gte=100,別寫price>100,這種引數不支援
Book.objects.filter(price__lt=100) #小於
Book.objects.filter(price__range=[100,200])  #sql的between and,大於等於100,小於等於200
Book.objects.filter(title__contains="python")  #title值中包含python的
Book.objects.filter(title__icontains="python") #不區分大小寫
Book.objects.filter(title__startswith="py") #以什麼開頭,istartswith  不區分大小寫
Book.objects.filter(pub_date__year=2012)

# all_books = models.Book.objects.filter(pub_date__year=2012) #找2012年的所有書籍
    # all_books = models.Book.objects.filter(pub_date__year__gt=2012)#找大於2012年的所有書籍
    all_books = models.Book.objects.filter(pub_date__year=2019,pub_date__month=2)#找2019年月份的所有書籍,如果明明有結果,你卻查不出結果,是因為mysql資料庫的時區和咱們django的時區不同導致的,瞭解一下就行了,你需要做的就是將django中的settings配置檔案裡面的USE_TZ = True改為False,就可以查到結果了,以後這個值就改為False,而且就是因為咱們用的mysql資料庫才會有這個問題,其他資料庫沒有這個問題。