1. 学生注册功能
1.新建 django项目
2.创建app
python manage.py startapp stu
3.修改根路由url
path(’/student’,include(‘stu.urls’))
4.创建子路由
new一个python文件
5.views中创建function
(1)如果是GET请求,访问页面。html
<form action="/student/" method="post">
<p>
<label for="sn">名字:</label><input name="sname" id="sn"/>
</p>
<p>
<label for="sc">所属班级:</label>
<select name="clsname" id="sc">
<option value="B201Python">B201Python</option>
<option value="B202Java">B202Java</option>
<option value="B203HTML5">B203HTML5</option>
</select>
</p>
<p>
<label >选课:</label>
<input type="checkbox" name="coursename" value="Python"/>Python  
<input type="checkbox" name="coursename" value="Java"/>Java  
<input type="checkbox" name="coursename" value="HTML5"/>HTML5  
</p>
<p>
<input type="submit" value="注册"/>
</p>
</form>
(2)POST请求,输入数据到数据库
①修改setting 数据库中的参数
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'pro202',
'HOST':'127.0.0.1',
'POST':'3306',
'USER':'root',
'PASSWORD':'111111',
}
}
②创建模型类 model
class Clazz(models.Model):
cno = models.AutoField(primary_key=True)
cname = models.CharField(max_length=30)
def __str__(self):
return u'Clazz:%s' % (self.cname)
class Course(models.Model):
course_no = models.AutoField(primary_key=True)
course_name = models.CharField(max_length=30)
def __str__(self):
return u'Course:%s' % (self.course_name)
class Student(models.Model):
sno = models.AutoField(primary_key=True)
sname = models.CharField(max_length=30)
cls = models.ForeignKey(Clazz)
cour = models.ManyToManyField(Course)
def __str__(self):
return u'Student:%s' % (self.sname)
③ 创立 迁移文件 makemigrations stu 并迁移 migrate
④写views代码
def index(request):
if request.method=='GET':
return render(request,'register.html')
else:
#请求数据
sname = request.POST.get('sname','')
cname = request.POST.get('clsname','')
coursename = request.POST.getlist('coursename',[])
#将数据注册数据库
flag = registerStu(sname,cname,*coursename)
if flag:
return HttpResponse('注册成功')
else:
return HttpResponse('注册失败')
⑤把表的增删改查写在modes模块中
def getCls(cname):
try:
cls = Clazz.objects.get(cname=cname)
except Clazz.DoesNotExist:
cls = Clazz.objects.create(cname=cname)
return cls
def getCourseList(*coursename):
courseList = []
for cn in coursename:
try:
c = Course.objects.get(course_name=cn)
except Course.DoesNotExist:
c = Course.objects.create(course_name=cn)
courseList.append(c)
return courseList
def registerStu(sname,cname,*coursename):
#获取班级对象
cls = getCls(cname)
#获取课程对象
courseList = getCourseList(*coursename)
#插入学生表信息
try:
stu = Student.objects.get(sname=sname)
except Student.DoesNotExist:
stu = Student.objects.create(sname=sname,cls=cls)
#插入中间表数据 先写两个表信息,在写关联信息
stu.cour.add(*courseList)
return True
2 查询班级信息
2.1 显示所有班级信息
1.修改子路由 path(‘showall/’,views.showall),
2.views中 获取所有的对象,并在页面显示
#显示所有班级
def showall(request):
cls = Clazz.objects.all()
return render(request,'showall.html',{'cls':cls})
3.html中创建页面
<table border="1" cellspacing="0" width="500px">
<tr>
<th>编号</th>
<th>班级名称</th>
<th>操作</th>
</tr>
{% for c in cls %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ c.cname }}</td>
<td>
<a href="/student/getstu/?cno={{ c.cno }}">详情</a> #链接对应好
</td>
</tr>
{% endfor %}
2.2 点击详情 显示班级信息
1.修改子路由 path(‘getstu/’,views.getstu)
2.修改视图文件
得到一个get请求的参数,在显示所有学生
根据班级查学生信息 :Clazz.objects.get(cno=c).student_set.all() 正向查询
根据学习信息查课程:正向 stu.cour.all
#显示班级下的所有信息
def getstu(request):
#获取班级标号
cno = request.GET.get('cno','')
c = int(cno)
#根据班级查学生信息
stus = Clazz.objects.get(cno=c).student_set.all()
return render(request,'stulist.html',{'stus':stus})
3.创建html文件
<table border="1" cellspacing="0" width="500px">
<tr>
<th>编号</th>
<th>姓名</th>
<th>班级名称</th>
<th>课程名称</th>
</tr>
{% for stu in stus %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ stu.sname }}</td>
<td>{{ stu.cls.cname }}</td>
<td>
{% for cou in stu.cour.all %}
{{ cou.course_name }}
{% endfor %}
</td>
</tr>
{% endfor %}
</table>
3.自定义manager (create方法)
object方就是重写manager方法
1.重写object方法,让其继承 from django.db.models.manager import Manager 中的Manager的类
2.Student.objects.create(sname=‘zxx’,cls=‘B208Python’,cour = (‘C++’,‘C’,‘JAVA’)) 通过这个给数据库插入值
3.获取cls参数,并让其生成clas的对象,并插入数据库中。
4.学生信息入库,
5.拿出kwarg中的参数,创立对象
6.课程信息入库
7.插入中间表
4重写save()方法
from stu.models import *
stu = Student(sname = ‘zhangsan’,score = 99,cls = Class(‘1707’))
stu.save()
save()是student对象中的方法。
class Class(models.Model):
cname = models.CharField(max_length=30)
class Student(models.Model):
sname = models.CharField(max_length=30)
score = models.PositiveIntegerField()
cls = models.ForeignKey(Class,on_delete=models.CASCADE)
def save(self, force_insert=False, force_update=False, using=None,
update_fields=None):
try:
self.cls = Class.objects.get(cname=self.cls.cname)
except Class.DoesNotExist:
self.cls = Class.objects.create(cname=self.cls.cname)
models.Model.save(self, force_insert=False, force_update=False, using=None,
update_fields=None)
5.聚合函数
show操作的数据库语言
def showsql():
from django.bd import connection
print(connection.queries[-1]['sql'])
1.求最大值
from django.db.models import *
Student.objects.aggregate(Max('score'))
2.最小值
from django.db.models import *
Student.objects.aggregate(Min('score'))
Student.objects.annotate(s = Min('score')) #起别名
3.总和
Count()
Avg()
Sum()
4.分组聚合
Student.objects.values(‘cls’).annotate(s = Count(‘score’))
5.关联查询
Student.objects.values(‘cls__cname’)
6.原生查询 用SQL语句来查询
1.通过raw
from stu.models import *
stus = Student.objects.raw(SQL语句) **#查询时候必须包含主键**
得到一个squeryset 列表
for s in stus:
print(s)
2.通过cursor
from django.db import connection
cur = connection().cursor()
cur.excute(SQL语句)
c = cur.fetchall() #获得所有数据
for info in c:
print(info)
cur.close() 关闭
7. Q查用用于与或非的操作:|,&,~,<,> .F查询 更新表中的值
1.Q查用用于与或非的操作:|,&,~,<,>
Student..objects.filter(Q(sname='zhangsan')|Q(score = 99))
Student.objects.filter(~Q(sname='lisi'))
2.F查询 更新表中的值 类似于:update update用于queryset ,不能用于对象
Student..objects.filter(id=3).update(score=F('score')+10)
8.装饰器 事务
1。二阶装饰器
2.三阶装饰器
3.事务
from django.db.transaction import antomic
#遇到异常自动回滚
@automic
def funct()
func中出错自动回滚
4.惰性查询
LIMIT 21
没输出的查询,并没有执行,print的时候再执行
5.缓存数据
体现再for循环中
第一次查询和第二次查询一致了,第二次运行的是第一次缓存的数据,只需要执行一次,
6.默认缓存位置:
1.
2.