在上篇文章中我们学习了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 -