django mysql使用

mysql安装
创建数据表
mysql -uroot -p   # 登录

show databases;

create database mysheet charset=utf8;
python安装pymysql模块
pip install pymysql
修改settings.py文件
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mysheet', # 数据库名称
        'HOST': '127.0.0.1',
        'PORT': 3306,  # 端口号 mysql
        'USER': 'root',
        'PASSWORD': 'mima',
    }
}
修改django项目下__init__.py文件

写入

from pymysql import install_as_MySQLdb

install_as_MySQLdb()

运行时注释掉报错行代码(D:\python37\lib\site-packages\django\db\backends\mysql\base.py 36行)
在这里插入图片描述
修改operations.py 第146行
query = query.decode(errors=‘replace’)

query = query.encode(errors=‘replace’)
在这里插入图片描述

在models.py中定义模型类
from django.db import models

class BookInfo(models.Model):

    btitle = models.CharField(max_length=20, verbose_name='名称')
    bpub_date = models.DateField(verbose_name='发布日期')

    class Meta:
        db_table = 'tb_books' # 表名
        verbose_name = '图书' # admin后台显示的名称
        verbose_name_plural = verbose_name # 显示的复数名称
    def __str__(self):
        '''定义对象的显示信息'''
        return self.btitle


class HeroInfo(models.Model):
    hname = models.CharField(max_length=20, verbose_name='名字')

    class Meta:
        db_table = 'tb_hero' # 表名
        verbose_name = '英雄' # admin后台显示的名称
        verbose_name_plural = verbose_name # 显示的复数名称
        
    def __str__(self):
        '''定义对象的显示信息'''
        return self.hname

Mate 可自定义设置表名,若不写Mate 则默认使用 应用小写_小写类名 作为表名

字段类型

字段选项

选项说明
null如果为True,表示允许为空,默认值是False
blank如果为True,则该字段允许为空白,默认值是False
db_column字段的名称,如果未指定,则使用属性的名称
db_index若值为True,则在表中会为此字段创建索引,默认值是False
default默认
primary_key若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项
unique如果为True,这个字段在表中必须有唯一值,默认值是False
null是数据库范畴的概念,blank是表单验证范畴的概念
设置外键
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name="图书")

BookInfo 为其它对象
外键必须设置on_delete参数

CASCADE级联,删除主表数据时连同一起删除外键表中数据
PROTECT保护,通过抛出ProtectedError异常,阻止删除主表中外键使用的数据
SET_NULL设置为NULL,仅在该字段null=True时使用
SET_DEFAULT设置为默认值,仅在该字段设置了默认值时可用
SET()设置为特定值或者调用特定方法
数据库迁移

python manage.py makemigrations
项目目录下会生成对应的migrations文件夹执行文件,但是数据还没有写入数据库

python manage.py migrate 执行数据库迁移操作

shell

使用命令

python manage.py shell
用类创建数据
from booktest.models import BookInfo, HeroInfo
from datetime import date
book = BookInfo(btitle="西游记", bpub_date=date(1988,1,1)) #此时在内存中创建数据
book.save()  # 写入数据库
hero = HeroInfo(hname="孙悟空")
hero.save()
ORM
增加数据
zbj = HeroInfo.objects.create(hname="猪八戒") # 创建自动会保存
# 增加数据时外键赋值
## 方式1
HeroInfo.objects.create(hname="猪八戒",hbook_id=6)
## 方式2
HeroInfo.objects.create(hname="猪八戒",hbook=book)
# hbook赋值为book对象
删除数据
h = HeroInfo.object.get(id=19)
h.delete()
查询数据
book = BookInfo.objects.all() # 查询book表中所有数据的查询集
book.count() # 统计个数

BookInfo.objects.count()
精准查询 返回数据对象
BookInfo.objects.get(id=3)  # 若没有数据或抛出异常 db.models.DoesNotExist
BookInfo.objects.get(id__gt=3,id__lt=5) # 多个条件查询
模糊查询 返回查询集
HeroInfo.objects.filter()  # 若没有返回空的查询集

模糊查询

exact判等HeroInfo.objects.filter(id__exact=1)
contains包含HeroInfo.objects.filter(hname__contains="猪")
startswith指定开头HeroInfo.objects.filter(hname__startswith="孙")
endswith指定结尾HeroInfo.objects.filter(hname__endswith="马")
isnull空查询HeroInfo.objects.filter(hname__isnull=False)
in是否在包含范围内HeroInfo.objects.filter(id__in=[1,3,5])
gt大于HeroInfo.objects.filter(id__gt=1)
gte大于等于HeroInfo.objects.filter(id__gte=2)
lt小于HeroInfo.objects.filter(id__lt=5)
lte小于等于HeroInfo.objects.filter(id__lte=5)
字段前加i,表示不区分大小写 示例: __icontains,__iendswith
获取除指定条件之外的元素
BookInfo.objects.exclude(id__lte=3)
日期查询

year,month,day,week_day,hour,minute,second

# 查询1980年发表的图书
BookInfo.objects.filter(bpub_date__year=1980)
# 查询1980年1月1日后发表的图书
from datetime import date
BookInfo.objects.filter(bpub_date__gt=date(1980,1,1))
F对象

属性值之间的对比

导入F对象

from django.db.models import F

# 查询阅读量大于这条数据评论量的数据
BookInfo.objects.filter(bread__gte=F('bcomment'))
Q对象

实现复杂条件的查询

from django.db.models import Q
# & 与 | 或 ~ 非
BookInfo.objects.filter(~Q(id__gt=10) | Q(id__lt=3))
数据排序
BookInfo.objects.all().order_by('bread')
# 降序排序
BookInfo.objects.all().order_by('-bread')
关联查询
# 方式1
## 一对多的查询,由一个图书对象查询关联的相关多个英雄
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()  
# 默认使用关联模型类小写_set
## 也可在定义hbook字段是自定义设置
hbook = models.ForeignKey(BookInfo, on_delete=models.CASCADE, related_name='hero') # 自定义related_name参数

b = BookInfo.objects.get(id=1)
b.hero.all()  
####################################################
# 方式2
h = HeroInfo.objects.get(id=1)
h.hbook    # 获取关联的图书对象
h.hbook_id    # 获取关联的图书id
####################################################
# 方式3
## 语法格式: 关联模型类小写__属性名__条件运算符=值
## 条件运算符部分可做省略
## 查询结果为book数据
BookInfo.objects.filter(heroinfo__hname='孙悟空')
# 查询英雄名称孙悟空对应的图书

####################################################
# 方式4
## 语法格式: 外键名称__外键对应模型类属性名__条件运算符=值
## 条件运算符部分可做省略
HeroInfo.objects.filter(hbook__bread__gt=30)
# 查询图书阅读量大于30的所有英雄
聚合函数

使用aggregate() 过滤器调用聚合函数。
聚合函数:

  • Avg 平均
  • Count 数量
  • Max 最大
  • Min 最小
  • Sum 求和
from django.db.models import Sum

BookInfo.objects.aggregate(Sum('bread')) # 返回 bread列数据求和结果
查询集

使用 all(),filter(),exclude().order_by()方法返回查询集

exists()方法判断查询集是否有数据

限制查询
BookInfo.objects.all()[1:2]
删除数据
# 调用对象的delete
BookInfo.objects.get(id=4).delete()
# 查询集的delete方法
BookInfo.objects.all().delete()
修改数据

方式一:

b = HeroInfo.objects.get(id=3)
b.hname = '孙悟空'
b.save()

方式二:

# 查询集的update方法
HeroInfo.objects.filter(hname__contains='孙').update(hname='孙大圣')
返回json数据
return JsonResponse(alist, safe=False)
自定义管理器

修改models.py文件

from django.db import models

class BookManager(models.Manager):
	def all(self):
		return super().filter(is_delete=False) # 获取is_delete字段为False的数据

模型类中添加

book = BookManager()

就可使用

BookInfo.book.all()

但是原来的

BookInfo.objects.all()

会失效

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值