2019.03.22 学生注册表
- 
学生注册
 - 
查看所有班级信息
 - 
显示某班学生情况
 
实现步骤
- 
创建模型类(班级,学生,课程)
 - 
配置URL
 - 
创建视图函数
 - 
创建模板页面
 
1.创建Django项目
2.setting 配置应用
3.修改sql连接数据库
4.生成迁移文件,执行迁移文件生成数据表。
5.配置路由,urls.py中还有要写的东西
6.此时简要的就完成了,可以简单的运行了
7.做了一些操作请求from urls的重写,处理
统一层级直接引入就可以。
24.25查询信息
这个是直接访问然后直接呈现出来的数据
还环环相扣
26.自定义Manager(查询)
这个是一个类,封装了许多数据库的方法属性。objects就是Manager的实例化,
因此当不满足方法的时候可以重写。
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.db.models.manager import Manager
class CustomManager(Manager):
    #重写Student.objects.all()
    # def all(self):
    #     return Manager.all(self).filter(isdelete=False)
    def get_queryset(self):
        return Manager.get_queryset(self).filter(isdelete=False)
class DeletedManager(models.Manager):
    def get_queryset(self):
        return Manager.get_queryset(self).filter(isdelete=True)
# Create your models here.
class Student(models.Model):
    sname=models.CharField(max_length=30,unique=True)
    isdelete=models.BooleanField(default=False)
objects=CustomManager()
delStus=DeletedManager()
    class Meta:
        db_table='t_student'
    def __unicode__(self):
        return u'Student:%s'%self.sname
当我删除数据库时,只是会变成逻辑删除,isdelete为True 1
这就是会在数据库中表示删除了
不对,是他在上面修改了。为什么要重写方法呢?
单个对象删除
- 
Student.objects.first().delete()
 - 
Student.delete() #重写的是这个的父类delete()方法
 
批量删除
- 
Student.objects.filter().delete()
 - 
Student.objects.filter().all() #重写_clone()方法
 - 
Student.objects.all() #重写get_queryset()方法 查询所有记录
 
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.db.models import QuerySet
from django.db.models.manager import Manager
class CustomManager(Manager):
    #查询出需要删除的记录
    def get_queryset(self):
        row_queryset = Manager.get_queryset(self).filter(isdelete=False)
        return row_queryset
    #重写父类filter方法
    def filter(self, *args, **kwargs):
        #调用父类的filter方法
        dellist = Manager.filter(self, *args, **kwargs)
        #声明闭包方法进行逻辑删除
        def delete1(delqueryset):
            for delq in delqueryset:
                delq.isdelete=True
                delq.save()
        import new
        dellist.delete = new.instancemethod(delete1,dellist,QuerySet)
        return dellist
Student.objects.filter().delete()
# Create your models here.
class Student(models.Model):
    sname=models.CharField(max_length=30,unique=True)
    isdelete=models.BooleanField(default=False)
    objects=CustomManager()
    # 重写Student.delete()
    #实现单条记录的逻辑删除
    # def delete(self, using=None, keep_parents=False):
    #     self.isdelete=True
    #     self.save()
    class Meta:
        db_table='t_student'
    def __unicode__(self):
        return u'Student:%s'%self.sname
 
闭包:
在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models
from django.db.models.manager import Manager
class CustomManager(Manager):
    # 重写方法Student.objects.create()
    # 实现Student.objects.create(sname='lisi',clazz='B208Python',course=('HTML5','UI','Java','Python'))
    def create(self, **kwargs):
        clsname=kwargs.get('clazz')
        clazz = self.__get_cls(clsname)
        kwargs['clazz']=clazz
course=kwargs.pop('course')
        stu = Manager.create(self,**kwargs)
        stu.save()
        stu.course.add(*self.__get_course(*course))
    
return stu
    def __get_cls(self, clsname):
        try:
            cls = Clazz.objects.get(cname=clsname)
        except Clazz.DoesNotExist:
            cls = Clazz.objects.create(cname=clsname)
            
        return cls
    def __get_course(self,*course):
        row_course=[]
        for cour in course:
            try:
                r_cour = Course.objects.get(course_name=cour)
            except Course.DoesNotExist:
                r_cour = Course.objects.create(course_name=cour)
               
            row_course.append(r_cour)
        return row_course
class Clazz(models.Model):
    cname=models.CharField(max_length=30,unique=True)
    class Meta:
        db_table='t_clazz'
    def __unicode__(self):
        return u'Clazz:%s'%self.cname
class Course(models.Model):
    course_name=models.CharField(max_length=30,unique=True)
    class Meta:
        db_table='t_course'
    def __unicode__(self):
        return u'Course:%s'%self.course_name
# Create your models here.
class Student(models.Model):
    sname=models.CharField(max_length=30,unique=True)
    clazz=models.ForeignKey(Clazz)
    course=models.ManyToManyField(Course)
    objects=CustomManager()
    class Meta:
        db_table='t_student'
    def __unicode__(self):
        return u'Student:%s'%self.sname
 
                    
                
                
            
        
浙公网安备 33010602011771号