在上篇文章中我們學習了Django教程——模型,這篇文章學習Django教程——數據庫操作(增刪改查)。
在學習數據庫操作之前,我們需要定義好模型類,模型類代碼如下:
from?django.db?import?models
class?UserModel(models.Model):#?name:CharField字符串類型,最大長度為30,唯一值,索引name?=?models.CharField(max_length=30,?unique=True,?db_index=True)#?age:IntegerField整數類型,默認值為18age?=?models.IntegerField(default=18)
定義好模型類后,在終端執行如下命令進行遷移操作,將模型映射到數據庫,
python?manage.py?makemigrations????#?生成遷移文件
python?manage.py?migrate????????#?執行遷移
大家可以參考之前的文章——Django框架——模型來進行上面的步驟。
在url.py文件中編寫URL路由綁定代碼,如下圖所示:
from?django.urls?import?path
from?myApp.views?import?*
urlpatterns?=?[path('addUser/',add_user),??????????????#?添加數據path('deleteUser/',delete_user),????????#?刪除數據path('updateUser/',?update_user),???????#?修改數據path('getUser/',?get_user)??????????????#?查詢數據
]
我們在views.py文件中編寫視圖函數實現數據庫操作——增刪改查,直接訪問對應的URL即可。
添加數據
添加單條數據
save方法
from?myApp.models?import?*
def?add_user(request):addUser=UserModel()???#?創建模型類實例addUser.name='張三'?????#?給模型類中name賦值addUser.age='18'???#?給模型類中age賦值addUser.save()????#?調用save方法,保存數據到數據庫
首先創建模型類實例,再給模型類字段賦值,最后調用save方法,將數據保存到數據庫中。當然我們也可以將創建模型實例和字段賦值合并在一起,代碼如下:
addUser=UserModel(name='李四',age=18)
create方法
使用create方法添加單條數據,其語法格式如下:
模型類.objects.create(字段1='值',字段n='值')
示例代碼如下:
UserModel.objects.create(name='王五',age=30)
create方法很簡單,通過模型類調用objects再調用create()方法即可添加單條數據到數據庫中。
get_or_create方法
由于我們模型類字段中的name設置了唯一值屬性,所以在使用save方法或create方法添加重復數據時,會報錯,這時我們可以使用get_or_create方法,防止添加重復數據導致報錯,其語法格式如下:
模型類.objects.get_or_create(字段1='值',字段n='值')
示例代碼如下:
UserModel.objects.get_or_create(name='趙六',age=30)
添加多條數據
添加多條數據與添加單條數據差不多,添加多條數據就是創建多個模型類的實例對象,再將實例對象放在列表中,再使用bulk_create方法添加在數據庫中。示例代碼如下:
from?myApp.models?import?*
def?add_user(request):mylist=[]for?i?in?range(20,30):mylist.append(UserModel(name=f'王{i}',age=i))UserModel.objects.bulk_create(mylist)return?HttpResponse('添加成功')
查詢數據
方法
查詢數據主要有如下5種方法:
方法 | 說明 |
---|---|
get() | 獲取單條數據,沒有找到符合條件的對象,會引發模型類DoesNotExist錯誤;找到多個,會引發模型類MultipleObjectsReturned錯誤 |
exists() | 判斷查詢集中是否有數據,如果有數據返回True,沒有數據返回False |
filter() | 類似數據庫中的where語句,添加查詢條件 |
exclude() | 獲取查詢條件外的數據,相當于not in |
all() | 獲取所有數據 |
其語法格式如下:
模型.objects.get(查詢條件)???#?當沒查詢條件時,若數據只有一條數據時,不會報錯
模型.objects.exists()????
模型.objects.filter(查詢條件)
模型.objects.exclude(查詢條件)
模型.objects.all()
注意:查詢數據返回的數據類型為django.db.models.query.QuerySet。
可以在查詢語句后面加values()或values_list()方法來獲取返回數據的值,其語法格式如下:
values(字段1...,字段n)???#?獲取指定字段的值,可以傳多個字段,返回包含字典的列表
values_list(字段1...,字段n)??????#?獲取指定字段的值,可以傳多個字段,返回包含元組列表
我們也可以使用獲取first()、last()分別獲取查詢返回值的第一行、最后一行數據。
示例代碼如下:
def?get_user(request):print(UserModel.objects.filter(age__gt=45).values('name').count())print(UserModel.objects.filter(age__gt=45).values('name').first())print(UserModel.objects.filter(age__gt=45).values_list('name','age').last())return?HttpResponse('')
運行結果如下:
4
{'name':?'王46'}
('王49',49)
查詢操作符
查詢數據通常會給出一些查詢條件,數值類型查詢操作符有:
條件 | 說明 |
---|---|
字段__gt=2 | 獲取字段值大于2的數據 |
字段__gte=2 | 獲取字段值大于等于2的數據 |
字段__lt=2 | 獲取字段值小于2的數據 |
字段__lte=2 | 獲取字段值小于等于2的數據 |
字段__in=[1,2,3] | 獲取字段值等于1或2或3的數據 |
字段__range[1,10] | 獲取字段值在1到10范圍的數據 |
字符串類型查詢操作符有:
類型 | 說明 |
---|---|
字段__contains='a' | 獲取字段值包含a的數據 |
字段__icontains='a' | 獲取字段值包含a的數據,大小寫不敏感 |
字段__regex="^a" | 正則匹配 |
字段__iregex="^a" | 正則匹配,忽略大小寫 |
字段__in=['a','b','c'] | 獲取字段值等于a或b或c的數據 |
字段__exact=a | 獲取字段值等于a的數據 |
字段__iexact=a | 獲取字段值等于a的數據,忽略大小寫 |
字段__endswith=a | 獲取字段值最后一個字符為a的數據 |
字段__iendswith=a | 獲取字段值最后一個字符為a的數據,忽略大小寫 |
字段__isnull=True | 獲取字段值為空的數據 |
字段__startswith=a | 獲取字段值第一個字符為a的數據 |
字段__istartswith=a | 獲取字段值第一個字符為a的數據,忽略大小寫 |
示例代碼如下:
def?get_user(request):?print(UserModel.objects.all().values())???#?獲取所有數據?print(UserModel.objects.filter(age__gt=25).values_list())??#?獲取age字段大于45的值return?HttpResponse('')
訪問http://127.0.0.1:8000/getUser/結果如下:
<QuerySet?[{'id':?35,?'name':?'王40',?'age':?40},?{'id':?36,?'name':?'王41',?'age':?41},?{'id':?37,?'name':?'王42',?'age':?42},?{'id':?38,?'name':?'王43',?'age':?43},?{
'id':?39,?'name':?'王44',?'age':?44},?{'id':?40,?'name':?'王45',?'age':?45},?{'id':?41,?'name':?'王46',?'age':?46},?{'id':?42,?'name':?'王47',?'age':?47},?{'id':?43,?'name':?'王48',?'age':?48},?{'id':?44,?'name':?'王49',?'age':?49}]>
<QuerySet?[(41,?'王46',?46),?(42,?'王47',?47),?(43,?'王48',?48),?(44,?'王49',?49)]>
排序
我們可以使用order_by()方法對查詢結果進行排序,示例代碼如下:
def?get_user(request):?print(UserModel.objects.all().values().order_by('name'))???#?獲取所有數據并升序排序?print(UserModel.objects.all().values().order_by('-name'))???#?獲取所有數據并降序排序return?HttpResponse('')?
運行結果如下:
<QuerySet?[{'id':?35,?'name':?'王40',?'age':?40},?{'id':?36,?'name':?'王41',?'age':?41},?{'id':?37,?'name':?'王42',?'age':?42},?{'id':?38,?'name':?'王43',?'age':?43},?{
'id':?39,?'name':?'王44',?'age':?44},?{'id':?40,?'name':?'王45',?'age':?45},?{'id':?41,?'name':?'王46',?'age':?46},?{'id':?42,?'name':?'王47',?'age':?47},?{'id':?43,?'name':?'王48',?'age':?48},?{'id':?44,?'name':?'王49',?'age':?49}]>
<QuerySet?[{'id':?44,?'name':?'王49',?'age':?49},?{'id':?43,?'name':?'王48',?'age':?48},?{'id':?42,?'name':?'王47',?'age':?47},?{'id':?41,?'name':?'王46',?'age':?46},?{
'id':?40,?'name':?'王45',?'age':?45},?{'id':?39,?'name':?'王44',?'age':?44},?{'id':?38,?'name':?'王43',?'age':?43},?{'id':?37,?'name':?'王42',?'age':?42},?{'id':?36,?'name':?'王41',?'age':?41},?{'id':?35,?'name':?'王40',?'age':?40}]>
聚合
在查詢返回的數據集中,我們可以使用aggregate()方法傳遞函數統計返回的數據集,常用的函數有:
函數 | 說明 |
---|---|
Avg | 平均值 |
count | 數量 |
Max | 最大 |
Min | 最小 |
Sum | 求和 |
示例代碼如下:
from?django.db.models?import?Max,Min,Sum
def?get_user(request):print(UserModel.objects.aggregate(Max('age')))print(UserModel.objects.aggregate(Min('age')))print(UserModel.objects.aggregate(Sum('age')))print(UserModel.objects.all().count())return?HttpResponse('')
運行結果如下:
{'age__max':?49}
{'age__min':?40}
{'age__sum':?445}
10
刪除數據
刪除數據是在查詢數據的基礎上添加delete()方法,示例代碼如下:
def?delete_user(request):UserModel.objects.filter(name='王46').delete()return?HttpResponse('刪除成功')
這樣即可刪除name為王46的數據。
修改數據
修改數據可以使用save()方法或update()方法
save方法
使用save方法修改數據需要通過查詢語句獲取要修改的數據,再對數據進行修改,最后調用save()方法保存,示例代碼如下:
def?update_user(request):#?修改第一條數據updateUser=UserModel().objects.first()updateUser.age=666updateUser.save()#?修改指定數據updateUser=UserModel.objects.filter(name='王47')updateUser.name='王222'updateUser.save(update_fields=['name'])???????#?自定修改數據的字段return?HttpResponse('')
在調用save方法中,添加update_fields參數可以一定程度上提高修改的效率。
update方法
使用update方法修改數據會相對簡潔一些,示例代碼如下:
def?update_user(request):UserModel.objects.filter(name='王222').update(name='王47')return?HttpResponse('修改成功')
這樣就成功修改了數據。
好了,Django框架——數據庫操作(增刪改查)就學習到這里。
公眾號:白巧克力LIN
該公眾號發布Python、數據庫、Linux、Flask、Django、自動化測試、Git、算法、前端、服務器等相關文章!
- END -