2019.03.22 学生注册表

需求

  1. 学生注册

  2. 查看所有班级信息

  3. 显示某班学生情况

实现步骤

  1. 创建模型类(班级,学生,课程)

  2. 配置URL

  3. 创建视图函数

  4. 创建模板页面

 

1.创建Django项目

2.setting 配置应用

3.修改sql连接数据库

4.生成迁移文件,执行迁移文件生成数据表。

5.配置路由,urls.py中还有要写的东西

6.此时简要的就完成了,可以简单的运行了

7.做了一些操作请求from urls的重写,处理

统一层级直接引入就可以。

 

 

24.25查询信息

这个是直接访问然后直接呈现出来的数据

还环环相扣

 

26.自定义Manager(查询)

这个是一个类,封装了许多数据库的方法属性。objects就是Manager的实例化,

因此当不满足方法的时候可以重写。

重写all()_get_queryset()

# -*- 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




 

闭包:


  在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。


重写create()

 

# -*- 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

 

 

 

 

 

posted @ 2019-03-22 10:12  AJking  阅读(187)  评论(0编辑  收藏  举报