Django对象的增删改查
我们为了对django对象的增删改查进行总结,先在model.py文件中创建类便于举例
定义学生:
class Students(models.Model):sname=models.CharField(max_length=20)sgender=models.BooleanField(default=True)sage=models.IntegerField()sscord=models.CharField(max_length=20)isDelete=models.BooleanField(default=False)# 这里可以添加Meta类进行对元类的重命名和排序操作class Meta:db_table=xxx # 定义数据表名,推荐使用小写字母ordering=[] # 对象的默认排序字段 ,获取对象列表时使用,通常是Integer(整数)类型,升序ordering['id'],降序用ordering['-id']
然后在url.py文件中添加一个链接转到views.py文件中:
url(r'^show/',views.show)
接下来在views.py文件中进行具体的增删改查操作
下面是一些例子:
查询:
# 类名.objects.all() #查询所有对象
Students.objects.all()# 类名.object.get('条件') #查询单个对象
Students.object.get(sage=18)# 类名.object.filter.(条件查询) #模糊查询
#查询年龄小于等于18岁的学生信息
Student.objects.filter(age__lte=20).all()
#查询出年龄大于等于18岁的用户信息,但是使用的是exclude函数
Students.objects.exclude(age__gt=18).all()# 查询结果集的数量
Students.objects.all().count()# 判断查询结果集是否有值
Students.objects.all().exists()# 使用切片的形式拿到前几个值
Students.objects.all()[0:3]# 求出年龄大于学分的所有学生信息
# Student.object.filter(sage__gt=F('sscord')).all()# 求出年龄大于20,并且姓名包含e的所有信息
Students.object.filter(sage__gt=20).filter(sname__contains='e').all()
修改:
# 排序 (默认升序,降序的话属性前面加‘-’)
Students.objects.order_by('sage')#修改
得到对应的对象
模型对象.属性=属性值
模型对象.save()
stu=Students.object.get(sage=18)
stu.sage=19
stu.save()
删除:
获得对象名
对象名.delete()
stu = Students.objects.get(pk=1)
stu.delete()
增加:
对象.save
stu=Students()
sname=jeck
sage=18
sscord=60
stu.save()
context = {'stu':stu}
return render(request,'show.html',context=context)或者直接返回
return render(request,'show.html',locals())
最后在show.py文件里展示views.py文件中的内容
show.py:
<ul>{% for i in stu %}<li>{{ i.sname }}</li>{% endfor %}
</ul>
上面只是一些大概的例子,下面进行总结:
--------------------------------------------------------------------------
ORM(Object Relational Mapping)对象关系映射,是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。
可以简单理解为翻译机,用于django与数据库交互
Django默认通过模型的‘objects’对象实现模型数据查询
Django有两种过滤器用于筛选记录:
filter :返回符合筛选条件的数据集
exclude :返回不符合筛选条件的数据集
多个filter 和 exclude可以连接在一起查询
返回查询集:
all() :返回所有数据
filter() :返回符合条件的数据
exclude():过滤掉符合条件的数据
order_by():排序
values():一条数据就是一个字典,返回一个列表
返回单个数据:
get():返回一个满足条件的对象,没有找到会引发模型类.DoesNotExist异常,找到多个会引发模型类.MultiObjectsReturned异常
first():返回查询集中的第一个对象
last():返回查询集的最后一个对象
count():返回当前查询集中的对象个数
exists():判断查询集中是否有数据,如果有返回True,反之返回False
限制查询集和查询集的缓存:
限制查询集可以使用下标的方法进行限制,等同于sql中的limit
studentList=Students.objects.all()[0:5] #下标不能是负数
查询集的缓存:每个查询集都有一个缓存,来最小化对数据库的访问
在新建的查询集中,缓存首次为空,第一次对查询集求值,会发生数据缓存,django会将查询出来的数据做一个缓存,并返回查询结构,以后查询直接使用查询集的缓存
过滤器filter(),exclude()以及get()的参数:
语法:属性名称_比较运算符=值比较运算符:
exact:判断,大小写敏感, filter(isDelete=False)
contains:是否包含,大小写敏感, filter(sname_contains='赵')
startswith,endswith:以values开头或结尾,大小写敏感
在以上四个运算符前加上i(ignore)就不区分大小写了
isnull,isnotnull:是否为空, filter(sname_isnull=False)
in:是否包含在范围内,filter(pk_in=[1,2,3,4])
gt,gte,lt,lte:大于,大于等于,小于,小于等于, filter(sage_gt=30)表示时间的:
year,month,day,week_day,hour,minute,second:filter(lasttime__year=2017)
pk:代表主键,filter(pk=1)跨关系查询:
模型类名__属性名__比较运算符,实际上就是处理的数据库中的join
grade = Grade.objects.filter(student__scontend__contains='赵钱孙')
描述中带有'赵钱孙'这三个字的数据属于哪个班级聚合函数:
使用aggregate()函数返回聚合函数的值
Avg:平均值
Count:数量
Max:最大
Min:最小
Sum:求和
Student.objects().aggregate(Max('sage'))
F对象:
可以使用模型的A属性与B属性进行比较
grades = Grade.objects.filter(ggirlnum__gt=F('gboynum') )
F对象支持算数运算
grades = Grade.objects.filter(ggirlnum__gt=F('gboynum') +10 )
Q对象:
过滤器的方法中的关键参数,常用于组合条件
年龄小于25
Student.objects.filter(Q(sage__lt=25))
Q对象语法支持 | (or), & (and), ~(取反)
年龄大于等于的
Student.objects.filter(~Q(sage__lt=25))
-------------------------------------------------------
在Django中,我们有些时候使用Django自带的ORM语句无法达到操作数据库的效果,这时,我们可以自定义一个管理器来进行数据库的操作。从总体上来说,就是重写方法和自定义方法
django的隐性属性和显性属性
显性: 自己写的那些
隐性: objects 是一个Manager类型的一个对象,作用于数据库进行交互
自定义模型管理器作用:
可以向管理器中添加额外的方法
修改管理器返回的原始查询集
提供创建对象的方式
不同的操作在不同的类中,如all() 在Manager类,get()在Query类中
一个例子说明自定义管理器类的作用:
通过Student.objects.all() 查询sgender为True的记录class Student(models.Model):sno = models.AutoField(primary_key=True)sname = models.CharField(max_length=30,null=False)sgender = models.BooleanField(default=False)objects = getAllTrue() #创建一个自定义类对象def __str__(self):return "Student:%s--%s"%(self.sname,self.sgender)#自定义管理类
class getAllTrue(models.Manager): #all()来自于Manager类# def all(self): #重写方法# return Manager.all(self).filter(sgender = True) #功能操作def get_queryset(self): # 与all() 方法相同,在源码中,all()执行就是调用get_queryset()方法。return Manager.get_queryset(self).filter(sgender=True)