Django的ORM常用查找操作總結


作者:python技術人
博客:https://www.cnblogs.com/lpdeboke/

首先這里給出一個用戶信息model

class UserModel(models.Model):
    u_name = models.CharField(max_length=16, unique=True)
    u_password = models.CharField(max_length=256)
    u_email = models.CharField(max_length=128, unique=True)
    u_icon = models.ImageField(upload_to="icons")  #用戶頭像
    is_delete = models.BooleanField(default=False)  #是否邏輯刪除
    is_active = models.BooleanField(default=False)  #是否激活
 

返回新QuerySets的API

方法名	                解釋
all()	            獲取所有的對象
filter()	        過濾查詢對象。
exclude()	        排除滿足條件的對象
annotate()	        使用聚合函數
order_by()	        對查詢集進行排序
reverse()	        反向排序
distinct()	        對查詢集去重
values()	        返回包含對象具體值的字典的QuerySet
values_list()	    與values()類似,只是返回的是元組而不是字典。
dates()	            根據日期獲取查詢集
datetimes()	        根據時間獲取查詢集
none()	            創建空的查詢集
union()	            並集
intersection()	    交集
difference()	    差集
select_related()	附帶查詢關聯對象
prefetch_related()	預先查詢
extra()	            附加SQL查詢
defer()	            不加載指定字段
only()	            只加載指定的字段
using()	            選擇數據庫
select_for_update()	鎖住選擇的對象,直到事務結束。
raw()	            接收一個原始的SQL查詢

重點關注以下幾個

1.fliter():

filter(**kwargs)
 
返回滿足查詢參數的對象集合。
 
查找的參數(**kwargs)應該滿足下文字段查找中的格式。多個參數之間是和AND的關系。
 
UserModel.objects.filter(u_age=10)#查詢滿足年齡等於10歲的所有用戶對象

1.1大於、大於等於:
__gt  大於>        
__gte  大於等於>=
 
UserModel.objects.filter(age__gt=10)    // 查詢年齡大於10歲的用戶
UserModel.objects.filter(age__gte=10)  // 查詢年齡大於等於10歲的用戶
 
1.2小於、小於等於:
__lt  小於<
__lte 小於等於<=
 
UserModel.objects.filter(age__lt=10)     // 查詢年齡小於10歲的用戶
UserModel.objects.filter(age__lte=10)   // 查詢年齡小於等於10歲的用戶
1.3 like:
__exact        精確等於       like 'aaa'
__iexact       精確等於       忽略大小寫 ilike 'aaa'
__contains     包含           like '%aaa%'
__icontains    包含,忽略大小寫 ilike '%aaa%',但是對於sqlite來說,contains的作用效果等同於icontains。

1.4 in:

__in
 
查詢年齡在某一范圍的用戶
UserModel.objects.filter(age__in=[10, 20, 30])

1.5 is null / is not null:

__isnull  判空
 
UserModel.objects.filter(name__isnull=True)    // 查詢用戶名為空的用戶
UserModel.objects.filter(name__isnull=False)  // 查詢用戶名不為空的用戶

1.6 不等於/不包含於:


UserModel.objects.filter().excute(age=10)    // 查詢年齡不為10的用戶
UserModel.objects.filter().excute(age__in=[10, 20])  // 查詢年齡不在 [10, 20] 的用戶

1.7 其他常用模糊查詢:
__startswith 以…開頭
__istartswith 以…開頭 忽略大小寫
__endswith 以…結尾
__iendswith 以…結尾,忽略大小寫
__range 在…范圍內
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日

1.8 多表連接查詢:

class A(models.Model):
    name = models.CharField(u'名稱')
 class B(models.Model):
    aa = models.ForeignKey(A)
 
B.objects.filter(aa__name__contains='searchtitle')#查詢B表中外鍵aa所對應的表中字段name包含searchtitle的B表對象。

2.exclude():

exclude(**kwargs)
 
返回一個新的QuerySet,它包含不滿足給定的查找參數的對象
 
UserModel.objects.exclude(age__gt=20, name='lin')#排除所有年齡大於20歲且名字為“lin”的用戶集

3.annotate():

annotate(args, *kwargs)
 
使用提供的聚合表達式查詢對象。
 
表達式可以是簡單的值、對模型(或任何關聯模型)上的字段的引用或者聚合表達式(平均值、總和等)。
 
annotate()的每個參數都是一個annotation,它將添加到返回的QuerySet每個對象中。
 
關鍵字參數指定的Annotation將使用關鍵字作為Annotation 的別名。 匿名參數的別名將基於聚合函數的名稱和模型的字段生成。 只有引用單個字段的聚合表達式才可以使用匿名參數。 其它所有形式都必須用關鍵字參數。
 
例如,如果正在操作一個UserModel列表,你可能想知道每個UserModel有多少u_name:
#用django shell來調試
>>> from django.db.models import Count
>>> q = UserModel.objects.annotate(Count('u_name'))
# The name of the first UserModel
>>> q[0].u_name
'leon'
# The number of q[0].u_name on the first UserModel
>>> q[0].u_icon
3

4.order_by():


order_by(*fields)
 
默認情況下,根據模型的Meta類中的ordering屬性對QuerySet中的對象進行排序
UserModel.objects.filter(is_delete=False).order_by('-u_age', 'is_active')
上面的結果將按照age降序排序,然后再按照name升序排序。"-age"前面的負號表示降序順序。 升序是默認的。 要隨機排序,使用"?",如下所示:
UserModel.objects.order_by('?')

5. reverse():

reverse()
 
反向排序QuerySet中返回的元素。 第二次調用reverse()將恢復到原有的排序。
 
如要獲取QuerySet中最后五個元素,可以這樣做:
 
my_queryset.reverse()[:5]
 
這與Python直接使用負索引有點不一樣。 Django不支持負索引

6.distinct():


distinct(*fields)
 
去除查詢結果中重復的行。
 
默認情況下,QuerySet不會去除重復的行。當查詢跨越多張表的數據時,QuerySet可能得到重復的結果,這時候可以使用distinct()進行去重。

7. values():


values(fields, *expressions)
 
返回一個包含數據的字典的queryset,而不是模型實例。
 
每個字典表示一個對象,鍵對應於模型對象的屬性名稱。如:
 
# 列表中包含的是User對象
>>> UserModel.objects.filter(u_name__startswith='leon')
<QuerySet [<UserModel: UserModel object>]>

 
# 列表中包含的是數據字典
>>> UserModel.objects.filter(u_name__startswith='lipeng').values()
<QuerySet [{'u_password': '34', 'is_delete': True, 'u_icon': '23', 'u_email': '1rtewe@123.com', 'is_active': 2, 'id': 2, 'u_name': 'lipeng'}]>
 
另外該方法接收可選的位置參數*fields,它指定values()應該限制哪些字段。如果指定字段,每個字典將只包含指定的字段的鍵/值。如果沒有指定字段,每個字典將包含數據庫表中所有字段的鍵和值。如下:
>>> UserModel.objects.filter(u_name__startswith='leon').values()
<QuerySet [{'u_password': '123456', 'is_delete': True, 'u_icon': '3', 'u_email': '123@123.com', 'is_active': 2, 'id': 1, 'u_name': 'leon'}]>
 
UserModel.objects.values('id', 'u_name')
<QuerySet [{'id': 3, 'u_name': 'amy'}, {'id': 1, 'u_name': 'leon'}, {'id': 4, 'u_name': 'lind'}, {'id': 2, 'u_name': 'lipeng'}]>

8.values_list():


values_list(*fields, flat=False)
 
與values()類似,只是在迭代時返回的是元組而不是字典。每個元組包含傳遞給values_list()調用的相應字段或表達式的值,因此第一個項目是第一個字段等。 像這樣:
>>> UserModel.objects.values_list('id', 'u_name')
<QuerySet [(3, 'amy'), (1, 'leon'), (4, 'lind'), (2, 'lipeng')]>

引自:https://blog.csdn.net/qq_34493908/article/details/81352784


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM