1. 程式人生 > >Django中manger/QuerySet類與mysql數據庫的查詢

Django中manger/QuerySet類與mysql數據庫的查詢

sta lec 字典 mysql數據庫 tin 反轉 ted isn fence

Django中的單表操作

1.精確查詢

#查詢的結果返回是容器Query Set的函數(Query Set模型類)
?
# 1. all() 查詢的所有的符合條件的結果,支持正向索引,支持索引切片,不支持反向索引
?
user_list = User.objects.all()
print(type(user_list))
print(user_list)
print(user_list.query)
user = User.objects.all()[0] # [User: ming]
user1 = User.objects.all()[-1] # 不支持AssertionError: Negative indexing is not supported.
user2 = User.objects.all()[0:2] # <QuerySet [<User: [User: ming]>, <User: [User: xian]>]>
?
# 2. exclude(**kwargs) 查詢滿足條件對應額對立面的所有結果的list
?
user3 = User.objects.exclude(id=2)
# 該函數相當於將滿足條件的記錄剔除後返回其他所有記錄。
?
# 3. order_by(*field) 查詢按照指定的字段條件進行排序後的結果, ‘tag_name‘代表正序,‘-tag_name‘代表反序。
?
user4 = User.objects.order_by(‘id‘)
print(user4)
?
# Query Set 是一個儲存查詢記錄的容器,具備列表的一些操作接口,可以被叠代
for i in user4:
print(i)

# 4. reverse() 反轉查詢結果
user5 = User.objects.all().reverse()
# 將查詢結果反轉
?
# 5. count() 顯示查詢結果的記錄的條數,也就是Query Set容器中數據的條數
?
n = User.objects.all().reverse().count()
print(n)
?
# 6. exists() 判斷查詢結果是否存在,值為布爾類型
?
res = User.objects.filter(id=7).exists()
print(res)
?
False
(0.000) SELECT (1) AS `a` FROM `app_user` WHERE `app_user`.`id` = 7 LIMIT 1; args=(7,)
?
# 7. values(*field) 按照指定的字段們進行查詢,返回存放包含字段們的字典的QuerySet
?
user = User.objects.values(‘name‘, ‘age‘)
print(user)
?
#對應的sql: SELECT `app_user`.`name`, `app_user`.`age` FROM `app_user` LIMIT 21; args=()
?
<QuerySet [{‘name‘: ‘ming‘, ‘age‘: 25}, {‘name‘: ‘xian‘, ‘age‘: 26}, {‘name‘: ‘daidai‘, ‘age‘: 58}, {‘name‘: ‘jeans‘, ‘age‘: 23}, {‘name‘: ‘tenny‘, ‘age‘: 26}]>
?
# 8 values_list(*field) 同values類似,但是返回的記錄是以元組存放在Query Set中
?
user = User.objects.values_list(‘name‘, ‘age‘)
print(user)
<QuerySet [(‘ming‘, 25), (‘xian‘, 26), (‘daidai‘, 58), (‘jeans‘, 23), (‘tenny‘, 26)]>
(0.000) SELECT `app_user`.`name`, `app_user`.`age` FROM `app_user` LIMIT 21; args=()
?
# 9 distinct(*field) 將其他的查詢結果剔除重復的字段,括號內是字段名
user = User.objects.values(‘name‘, ‘age‘).distinct(‘name‘)

2.用manger類實現的增刪查改

# 增
user = User.objects.create(name=‘xiaojin‘, age=24, birthday=‘2018-12-12‘)
print(type(user))
print(user)
# <class ‘app.models.User‘>
# [User: xiaojin]
?
user = User(name=‘Zero‘, age=8, birthday=‘2010-06-01‘)
user.save()
?
# 查
# 操作的結果擁有是一個list
users = User.objects.filter(name=‘Owen‘)
?
# 只能操作有且只有一條數據的記錄
user = User.objects.get(id=1)
?
#改
User.objects.filter(name=‘Owen‘).update(name=‘Owen_best‘)
?
users = User.objects.filter(name=‘Owen_best‘)
for user in users:
user.name = ‘Owen‘
user.save()

#刪
User.objects.filter(name=‘Owen‘).delete()
?
user = User.objects.filter(name=‘Zero‘).first()
user.delete()

3.模糊查詢

user_list = User.objects.filter(id__gte=1)
?
# 整型相關
age__exact=8 # 確切匹配8
age__in=[8, 10] # 8或10
age__gt=8 # 大於8
age__gte=8 # 大於等於8
age__lt=8 # 小於8
age__lte=8 # 小於等於8
age__range=[8, 10] # 8到10之間
age__isnull=0|1 # 0:is not null | 1:is null
?
# 字符串相關
name__startswith # 後方模糊匹配
name__endswith # 前方模糊匹配
name__contains # 前後方均模糊匹配
name__regex # 正則匹配
name__istartswith # 不區分大小寫後方模糊匹配(i開頭就是不區分大小寫)
?
# 時間相關
birthday__year=2008 # 時間年份模糊匹配

4.特殊字查詢(F、Q查詢)

# 特殊字的查詢首先要導入django中的模型類中的F,Q
from django.db.models import F,Q
?
# F查詢(計算查詢,基於計算的)
# 需求一:將所有人的年齡加1
User.objects.all().update(age=F(‘age‘)+1)
?
# 需求二:將所有年齡的1/4等於id的記錄查詢出來
res = User.objects.filter(id=F(‘age‘)/4).exists()
?
# Q查詢
# Q基於關系 Q(‘字段條件‘)
# 與
User.objects.filter(Q(id=1) & Q(age=10)) # id=1 並且 age=10
# 或
User.objects.filter(Q(id=1) | Q(id=2)) # id=1 或 id=2
# 非
User.objects.filter(~Q(id=1)) # id 不為 1

Django中manger/QuerySet類與mysql數據庫的查詢