1.配置
1.使用MySQL数据库首先需要安装驱动程序
pip install PyMySQL
2.在Django的工程同名子目录的__init__.py文件中添加如下语句
from pymysql import install_as_MySQLdb
install_as_MySQLdb()
2.定义模型类
- 创建应用,并在models.py文件中定义模型类
class ***(models.Model)
属性=models.类型(选项)
外键=models.FK(模型类名称)
class Meta:
db_table=表名称
类型:分为数字、字符串、日期时间
选项:mysql中的约束
- 映射关系
3.迁移
- 1生成迁移文件:
python manage.py makemigrations
- 2.同步到数据库:
python manage.py migrate
注意:makemigrations 和 migrate 不要拼错
数据库操作—增、删、改、查
1.增加:
①save:
- 对象.save()
book = BookInfo()
book.btitle = '西游记'
book.bpub_date = date(2019, 7, 1)
book.bread = 10
book.save()
②create
- 模型类.objects.create()
book = BookInfo.objects.create(
btitle='红楼梦',
bpub_date=date(2019, 7, 2)
)
2.删除
①模型类对象delete:
- 查询,对象.delete()
hero = HeroInfo.objects.get(id=13)
hero.delete()
②模型类**.objects.filter().**delete()
- 模型类.objects.create()
:HeroInfo**.objects.filter(id=14).**delete()
3.修改
①save:
- 修改模型对象的属性,然后执行save()方法
- 查询,赋值,对象.save()
hero = HeroInfo.objects.get(hname=‘猪八戒’)
hero.hname = ‘猪悟能’
hero.save()
②update:
- 使用模型类.objects.filter().update(),会返回受影响的行数
- 模型类.objects.filter().update()
HeroInfo.objects.filter(hname=‘沙悟净’).update(hname=‘沙僧’)
4.查询
基本查询
①get::
- 模型类**.objects.**get(条件)
- 查询单一结果,如果不存在会抛出模型类.DoesNotExist异常。如果查询到多个结果,会抛出异常.
BookInfo.objects.get(id=3)
②filter::
- 模型类**.objects.**filter(条件)
- 过滤出多个结果
BookInfo.objects.filter(id=3)
③all
- 模型类**.objects.**all()
- 查询所有数据
BookInfo.objects.all()
过滤查询
①相等
- exact:表示判等
例:例:查询编号为1的图书。
BookInfo.objects.filter(id__exact=1)
可简写为:
BookInfo.objects.filter(id=1)
②模糊查询
- contains:是否包含。
例:查询书名包含’传’的图书。
BookInfo.objects.filter(btitle__contains=‘传’)
- startswith、endswith:以指定值开头或结尾。
例:查询书名以’部’结尾的图书
BookInfo.objects.filter(btitle__endswith=‘部’)
③空查询
- isnull:是否为null。
例:查询书名不为空的图书。
BookInfo.objects.filter(btitle__isnull=False)
④范围查询
- in:是否包含在范围内。
例:查询编号为1或3或5的图书
BookInfo.objects.filter(id__in=[1, 3, 5])
⑤比较查询
- gt 大于 (greater then)
- gte 大于等于 (greater then equal)
- lt 小于 (less then)
- lte 小于等于 (less then equal)
例:查询编号大于3的图书
BookInfo.objects.filter(id__gt=3)
⑥日期查询
- year、month、day、week_day、hour、minute、second:对日期时间类型的属性进行运算。
例:查询1980年发表的图书。
BookInfo.objects.filter(bpub_date__year=1980)
例:查询1980年1月1日后发表的图书。
BookInfo.objects.filter(bpub_date__gt=date(1990, 1, 1))
类型:
F():两个属性的比较
例:查询阅读量大于等于评论量的图书。
from django.db.models import F
BookInfo.objects.filter(bread__gte=F(‘bcomment’))
Q():实现逻辑或、非
例:查询阅读量大于20,并且编号小于3的图书。
BookInfo.objects.filter(bread__gt=20,id__lt=3)
或
BookInfo.objects.filter(bread__gt=20).filter(id__lt=3)
聚合类型,如Avg,Sum,Max,Min
例:查询图书的总阅读量
from django.db.models import Sum
BookInfo.objects.aggregate(Sum(‘bread’))
排序
BookInfo.objects.all().order_by(‘bread’) # 升序
BookInfo.objects.all().order_by(’-bread’) # 降序
关系过滤查询
关联查询
- 由一到多的访问语法:
一对应的模型类对象.多对应的模型类名小写_set 例:
b = BookInfo.objects.get(id=1)
b.heroinfo_set.all()
- 由多到一的访问语法:
多对应的模型类对象.多对应的模型类中的关系类属性名 例:
h = HeroInfo.objects.get(id=1)
h.hbook
关联过滤查询
- 由多模型类条件查询一模型类数据:
语法如下:
关联模型类名小写__属性名__条件运算符=值
例:查询图书,要求图书英雄为"孙悟空"
BookInfo.objects.filter(heroinfo__hname=‘孙悟空’)
查询图书,要求图书中英雄的描述包含"八"
"BookInfo.objects.filter(heroinfo__hcomment__contains=‘八’)
- 由一模型类条件查询多模型类数据:
语法如下:
一模型类关联属性名__一模型类属性名__条件运算符=值
查询书名为“天龙八部”的所有英雄。
HeroInfo.objects.filter(hbook__btitle=‘天龙八部’)
查询图书阅读量大于30的所有英雄
HeroInfo.objects.filter(hbook__bread__gt=30)