python Django(5)

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 &emsp;
            <input type="checkbox" name="coursename" value="Java"/>Java &emsp;
            <input type="checkbox" name="coursename" value="HTML5"/>HTML5 &emsp;
        </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.在这里插入图片描述

6 .pycharm中运行sql

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值