操作环境
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()