-
学生注册
-
查看所有班级信息
-
显示某班学生情况
实现步骤
-
创建模型类(班级,学生,课程)
-
配置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