Django學習4
阿新 • • 發佈:2020-08-03
ORM單表操作
類 --- 表
類物件 --- 一行資料
類屬性 --- 欄位
增
#建立記錄方式一 student_obj = models.Student( name='大壯', age=48, ) student_obj.save() #建立記錄方式二 models.Student.objects 物件控制器 new_obj = models.Student.objects.create(name='雪飛',age=18) #也可寫成**{'name':'雪飛','age':18} print(new_obj) # Student object -- model物件 .屬性可以獲取對應欄位的資料 print(new_obj.name) # 雪飛 print(new_obj.age) # 18 #建立記錄方式三 -- 批量建立1 objs = [] for i in range(20): obj = models.Student( name='玉溪%s'%i, age=10+i, ) objs.append(obj) models.Student.objects.bulk_create(objs) #建立記錄方式四 -- 批量建立2 update_or_create models.Student.objects.update_or_create( name = '雙喜', defaults={ 'age':26 } ) # 新增日期資料 # 方式一 datetime.datetime物件 import datetime current_date = datetime.datetime.now() models.Birthday.objects.create(name='小智',date=current_date) # 方式二 字串 models.Birthday.objects.create(name='路比',date='2000-6-18')
刪
#刪除 delete
models.Student.objects.get(id=1).delete() # 用model物件呼叫delete方法(get方法返回的是model物件)
models.Student.objects.filter(name='阿強').delete() # 用queryset物件也可呼叫delete方法
models.Student.objects.all().delete() # 刪除所有資料
改
#更新 models.Student.objects.get(name='阿強').update(age=30) # model物件沒有更新方法 報錯資訊:'Student' object has no attribute 'update' models.Student.objects.filter(name='阿強').update(age=30) # 只能queryset物件呼叫
查 (簡單)
簡單查詢(三劍客 all filter get) 1.查詢所有的資料 .all方法 返回的是QuerySet集合 all_objs = models.Student.objects.all() # print(all_objs) # <QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>]> -- 類似於列表 -- queryset集合 # for i in all_objs: # print(i.name) # 小智 小霞 小剛 print(all_objs) # < QuerySet[ < Student: 小智 >, < Student: 小霞 >, < Student: 小剛 >] >(改寫了__str__) 2.條件查詢 .filter方法 返回的是QuerySet集合,查詢不到內容不會報錯,返回<QuerySet []> objs = models.Student.objects.filter(id=3) # 找id為3的記錄 print(objs) # <QuerySet [<Student: 小剛>]> 3.條件查詢 .get方法 返回的是model物件!而且get方法有且必須只有一個結果,否則報錯(為空或者多了)! objs = models.Student.objects.get(id=3) # 找id為3的記錄 print(objs) # 小剛
查詢介面
<1> all(): 查詢所有結果,結果是queryset型別
<2> filter(**kwargs): 查詢與所給篩選條件相匹配的物件,結果是queryset型別
#多條件
models.Student.objects.filter(id=7,name='吳尊').update(name='無極尊',age=27,)
#打散形式傳參
models.Student.objects.filter(**{'id':7,'name':'無極尊'}).update(age=100,)
#queryset型別可以呼叫filter再過濾
models.Student.objects.all().filter(id=7)
<3> get(**kwargs): 返回與所給篩選條件相匹配的物件,model物件,返回結果有且只有一個,否則報錯
<4> exclude(**kwargs): 排除符合條件的物件 object控制器和queryset集合都可以呼叫,返回結果是queryset型別
object控制器呼叫:
query = models.Student.objects.exclude(id=3)
QuerySet物件呼叫:
query = models.Student.objects.filter(age=26).exclude(id=24)
<5> order_by(*field): queryset型別的資料來呼叫,對查詢結果排序,返回值還是queryset型別
query = models.Student.objects.all().order_by('age','-id') # 按age升序排,age相同的時候按id降序排
<6> reverse(): queryset型別的資料來呼叫,在排序的結果基礎上反向排序,返回值還是queryset型別
query = models.Student.objects.all().order_by('id').reverse()
<7> count(): queryset型別的資料來呼叫,返回資料庫中匹配查詢(QuerySet)的物件數量(數字)。
num = models.Student.objects.all().count()
<8> first(): queryset型別的資料來呼叫,返回第一條記錄,結果為model物件
<9> last(): queryset型別的資料來呼叫,返回最後一條記錄,結果為model物件
<10> exists(): queryset型別的資料來呼叫,如果QuerySet包含資料,就返回True,否則返回False
obj = models.Student.objects.all().filter(name='無極尊').exists()
if obj:print(obj)
else:print('nothing...')
<11> values(*field): 返回裡面是字典的queryset型別(一個字典就是一行資料,字典的鍵就是欄位)
query = models.Student.objects.filter(age=26).values()
print(query) # <QuerySet [{'id': 24, 'name': '相璽16', 'age': 26}, {'id': 28, 'name': '文洋', 'age': 26}]>
# values可以指定欄位
query = models.Student.objects.filter(age=26).values('name','age')
<12> values_list(*field): 返回裡面是元組的queryset型別(一個元組就是一行資料,元組裡面的每一項對應一個欄位)
query = models.Student.objects.filter(age=26).values_list()
print(query) # <QuerySet [(24, '相璽16', 26), (28, '文洋', 26)]>
# values_list也可以指定欄位
query = models.Student.objects.filter(age=26).values_list('name','age')
<13> distinct(): values和values_list得到的queryset型別的資料來呼叫,從返回結果中剔除重複紀錄,返回結果還是queryset型別
models.Student.objects.all().values('age').distinct()
基於雙下劃線的模糊查詢
# __ 找id>7的
query = models.Student.objects.filter(id__gt=7)
# __ 找id>=7的
query = models.Student.objects.filter(id__gte=7)
# 找id<7的
query = models.Student.objects.filter(id__lt=7)
# 找id<=7的
query = models.Student.objects.filter(id__lte=7)
# in
query = models.Student.objects.filter(id__in=[7, 8, 9]) # id值等於這三個裡面的任意一個的物件
# 範圍 相當於between...and...
query = models.Student.objects.filter(id__range=[5,10]) # id值在[5,10]內的
# 找name欄位裡有'相璽'的物件,只適用於字串型別的欄位
query = models.Student.objects.filter(name__contains='相璽')
# contains基礎上 + 不區分大小寫
query = models.Student.objects.filter(name__icontains='python')
# 找name欄位以'相'開頭的物件, istartswith 不區分大小寫
query = models.Student.objects.filter(name__startswith='相')
# 找name欄位以'飛'結尾的物件, iendswith 不區分大小寫
query = models.Student.objects.filter(name__endswith='飛')
# 日期結合__查詢:
# 找出生年為2000,月為07月的
query = models.Birthday.objects.filter(date__year='2000',date__month='07')
# 找出生年為2000,月為07月,日大於10的
query = models.Birthday.objects.filter(date__year='2000',date__month='07',date__day__gt='10')
# 以此類推......