首页Django

Django数据库操作(增、删、改、查)

2020年9月9日 19:04409

操作环境

1.Python 3.8
2.Django 3.0.2
3.Pycharm 2019.3
4.mysql   8.0.18

数据模型

# models.py

from django.db import models


class Author(models.Model):
    # 作者模型
    name = models.CharField('作者',max_length=32)


class Book(models.Model):
    # 图书模型
    name = models.CharField('标题',max_length=70)
    author = models.ForeignKey(Author,on_delete=models.CASCADE,verbose_name='作者')

    class Meta:
        verbose_name_plural = verbose_name = '图书管理'

    def __str__(self):
        return self.name

增加数据(三种方法)

# views.py

from django.shortcuts import render
from .models import Book  # 引用数据模型


def add_book(request):
    # 第一种方法
    Book.objects.create(name='Python从入门到放弃')
    # 第二种方法(实例化一个对象)
    books = Book(name='第二种数据添加方法')
    books.save()
    # 第三种方法(将数据组合成字典,键为字段、值为输入的数据)
    books = {'name':'这是第三种方法'}
    Book.objects.create(**books)

查询数据

1、基本查询

get:查询唯一结果,如果数据不存在会抛出(模型.DoesNotExist)异常

# 解决方法
try:
    article = Book.objects.get(id='1')
except Book.DoesNotExist:
    article = None
# all 查询多个结果
Book.objects.all()
# count 返回查询结果数量
Book.objects.count()
# filter 过滤多个结果,不要和get弄混淆
Book.objects.filter(name='django数据库操作教程')
# exclude 返回符合条件剩下的结果(排除法)
Book.objects.exclude(name='钢铁是怎样炼成的')
# exact 表示判等 iexact(不区分大小写)
Book.objects.filter(id__exact=1)
#可简写为
Book.objects.filter(id=1)
# contains 模糊查询 icontains不区分大小写
Book.objects.filter(name__contains='数据库')
# startswith、endswith 以指定值开头或结尾(startswith、endswith不区分大小写)
Book.objects.filter(name__startswith='保')  # 查询名字以'保'开始的数据
Book.objects.filter(name__endswith='存')  # 查询名字以'存'结束的数据
# isnull 是否为null
Book.objects.filter(name__isnull=False)  # 查询书名不为空的数据
# in 是否包含在范围内
Book.objects.filter(id__in=[1,3,5])  # 查询ID为1或3或5的数据

2、比较查询

# gt  大于(greater then)
# gte 大于等于(greater then equal)
# lt  小于(less then)
# lte 小于等于(less then equal)
Book.objects.filter(id__gt=3)  # 查询ID大于3的数据

3、日期查询

# year、month、day、week_day、hour、minute、second  对日期时间类型的属性进行运算

Book.objects.filter(pubtime__year=1988)  # 查询1988年发布的数据
Book.objects.filter(pubtime__gt=date(1990,1,1))  # 查询1990年1月1日后发布的数据

4、F对象查询

# 语法:对象.objects.filter(属性__gte=F('属性'))

from django.db.models import F
Book.objects.filter(bread__gte=F('bcomment'))

# 可以在F对象上使用算术运算,例:查询阅读量大于评论量的数据
Book.objects.filter(bread__gt=F('bcomment')*2)

5、Q对象查询

# 如果需要实现逻辑、or的查询,需要使用Q对象结合|运算符
# 语法如下:
# Q对象可以使用'&、|'连接,&表示逻辑与,|表示逻辑或
# Q对象前可以使用~操作符,表示非not
# 对象.objects.filter(Q(属性__gt=20) | Q(属性__lt=3))

from django.db.models import Q
Book.objects.filter(Q(views__gt=20) | Q(id__lt=3)) # 查询阅读量大于20,并且编号小于3的数据

6、聚合函数

# 使用aggregate()过滤器调用聚合函数,聚合函数包括:Avg平均、Count数量、Max最大、Min最小、Sum求和
# 对象.object.aggregate(Sum('属性'))
# 语法如下:

from django.db.models import Sum
Book.objects.aggregate(Sum('views'))  # 查询图书的总阅读量

7、排序

# order_by对结果进行排序

Book.objects.all().order_by('id')  # 升序
Book.objects.all().order_by('-id')  # 降序

8、关联查询

# 待补充

修改数据(两种方法)

# 修改模型类对象的属性,然后执行save()方法

books = Books.objects.get(name='我是条件')
books.name = '我被修改了'
books.save()


# 第二种修改数据的方法
# 使用模型类.objects.filter().update(),会返回受影响的行数

Book.objects.filter(name='我是条件').update(name='我被修改了')

删除数据(两种方法)

# 1.模型类对象delete()

books = Book.objects.get(id=3)
books.delete()

# 2.模型类.objects.filter().delete()

Book.objects.filter(id=1).delete()