在上篇文章中我们学习了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整数类型,默认值为18
    age = 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=666
    updateUser.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 -

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐