python
mysql
经过操做对象方法,来进行关系型数据库操做sql
shell
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'mydb', 'HOST': 'localhost', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '123456', } }
继承Model类(django.db.models.Model) 数据库
from django.db import models # Create your models here. class Student(models.Model): name = models.CharField(max_length=20) sex = models.CharField(max_length=10) score = models.FloatField() class Meta: #定义表结构的信息 db_table = 'students'
模型类对应于数据库表,类属性 对应于表字段django
建立好模型后,迁移(同步到数据库)缓存
1.制做迁移计划并发
python manage.py makemigrationsapp
2.执行计划任务函数
python manage.py migrate
【如下操做都是在shell环境中执行】
进入shell 环境
python manage.py shell
2.添加数据
2.1经过模型类的对象管理器插入记录
【此方法是直接操做数据库】
# 导入Student包 from myapp.models import Student stu1 = Student.objects.create(name='aaa',sex='m',score=95. 0)
2.2 实例化模型对象插入记录
【注意:经过对象模型进行 插入操做是在内存中执行的,须要经过save函数加载到数据库中】
stu3 = Student(name='a',sex='m',score=89) stu3.save()
3.添加记录
3.1经过模型类的对象管理器插入记录
语法:模型类名.objects.create(类属性=值)
【此方法是直接操做数据库】
# 导入Student包 from myapp.models import Student stu1 = Student.objects.create(name='aaa',sex='m',score=95. 0)
stu3 = Student(name='a',sex='m',score=89) stu3.save()
stu = Student.objects.get(id=1) stu.score = 100 stu.save() stu.delete()
1.查询主键为1的记录 stu = Student.objects.get(id=1) get()返回一条记录【即查询条件为惟一值且必须存在,通常查询主键】,以模型对象表示
查询全部: students1 = Student.objects.all() 返回Django的QuerySet对象,能够被遍历
4.2过滤查询
模型类名.objects.filter(查询条件)
s1 = Students.objects.filter(sex='m') 返回Django中的QuerySet容器,能够被遍历 多条件查询,查询条件使用,隔开表示逻辑与 s1 = Student.objects.filter(sex='m',name='aaa')
查询分数小于85的学生记录
students = Student.objects.exclude(score__gte=85)
字段后面跟双下划线"__",表示特殊查询 经常使用的双下划线魔法参数有: __year __month __day __startswith __endswith __gte 大于等于 __lte 小于等于 __contains (至关于模糊查询) s1 = Student.objects.filter(name__startswith='a')
s1 = Student.objects.all()[1:3] 查询前三个 s1 = Student.objects.all()[:3] 查询奇数条记录 s1 = Student.objects.all()[::2]
4.6排序查询
模型类名.objects.order_by("排序字段名")
降序 s1 = Student.objects.order_by('-score') 升序 s1 = Student.objects.order_by('score') 查询成绩前三名 s1 = Student.objects.order_by('-score')[:3]
# 模糊查询 使用原生sql查询名字中包含a的记录 s1 = Student.objects.raw('select * from students where nam e like "%%a%%"') 至关于select * from students where name like "%a%" # 使用占位符 查询名字为张三,性别为男的学生信息,使用原生sql语句 s1 = Student.objects.raw('select * from students where nam e="%s" and sex="%s"'%('张三','男')) a='张三' b='男' s1 = Student.objects.raw('select * from students where na me="{a}" and sex="{b}"') s1 = Student.objects.raw('select * from students where nam e=%s and sex=%s',['张三','男'])
4.8Q查询
经过实例化Q对象,将Q对象传递到filter()、get()方法中能够组合出多种查询条件
Q查询依赖于Q对象(from django.db.models import Q)
Q对象之间可使用&、|。在Q对象前加~表示Q封装条件的否认条件
查询男生中90分以上的学生记录 from django.db.models import Q q1 = Q(sex='男') q2 = Q(score__gte=90) s1 = Student.objects.filter(q1&q2) & :逻辑与 | :逻辑或 ~ :逻辑非
描述数据库层级的操做,而不是内存层级的操做 即,能够直接操做数据库中的数据,而不是先更改缓存,再上传数据库 解决并发性问题 使用F对象更新学生成绩,将1号学生成绩在原有基础上+5分 from django.db.models import F s1 = Student.objects.get(id=1) s1.score = F('score')+5 s1.save()
4.10 聚合查询
可能要导入的:from django.db.models import Min,Avg,Max,Sum,Count
查询全部学生的平均成绩 from django.db.models import Avg,Max,Min,Count,Sum avg = Student.objects.aggregate(Avg('score')) avg = Student.objects.all().aggregate(as=Avg('score')) as 是avg对象的别名 查询结果是一个字典
根据性别查询不一样性别的平均值 s1 = Student.objects.values('sex').annotate(Avg('score')) .values()方法能够显示对象中某个属性的值,以字典形式存储