作者: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