Django边学边记—模型增删改查
增删改:
增:
book = BookInfo() book.save() 和BookInfo.objects.create()
删:
book.delete() 和BookInfo.objects.get().delete()
改:
book.name='xxx' book.save() 和 BookInfo.objects.filter(id =XXX).update(name=xxx) # 如果 BookInfo.objects.get(id =XXX).update(name=xxx) 会报错
查询集
- 两大特性
- 惰性执行:创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用
- 缓存:查询集的结果被存下来之后,再次查询时会使用之前缓存的数据
- 返回列表的过滤器如下:
- all():返回所有数据
- filter():返回满足条件的数据
- exclude():返回满足条件之外的数据,相当于sql语句中where部分的not关键字
- order_by():排序,默认升序,降序的话在条件前加减号(-)
返回的QuerySet类型可以继续调用查询方法。也就是可以含有零个、一个或多个过滤器。
- 返回单个值的过滤器如下:
- get():返回单个满足条件的对象
- 如果未找到会引发"模型类.DoesNotExist"异常
- 如果多条被返回,会引发"模型类.MultipleObjectsReturned"异常
- get():返回单个满足条件的对象
- 与sql语句相比,查询集和select语句等价,过滤器像where和limit子句
- aggregate():聚合
- exists():判断查询集中是否有数据,如果有则返回True,没有则返回False
- 查询集 可以像列表一样进行切片。
字段查询
- 在Django的shell中 用__来连接属性名(sql中叫字段)和比较运算符,类似sql语句中的空格
-
属性名称__比较运算符=值 比如:类名.objects.filter(类属性__isnull=False)
条件运算符主要有:
- __exact:表示判等
- __contains:是否包含
- __startswith、__endswith:以指定值开头或结尾
- __isnull:是否为null
(以上运算符都区分大小写,在这些运算符前加上i表示不区分大小写,如__iexact、__icontains、__istartswith、__iendswith)
- __in:是否包含在范围内
- __gt、__gte、__lt、__lte:大于、大于等于、小于、小于等于,(不等于使用等于的运算符,使用exclude()过滤器)
- __year、__month、__day、__week_day、__hour、__minute、__second:对日期时间类型的属性进行运算
关联查询
- Django中也能实现类似于join查询,要查那个类中的数据就从那个类来查,写关联条件时如果类中没有关联属性,要写类的名字小写,有关联属性就写关联属性.语法如下:
要查的模型.objects.过滤器(关联模型类名小写[或关联属性]__属性名[__运算符]=值)
F对象
- 对象的属性与属性值比较,从django.db.models导入F对象。语法如下:
from django.db.models import F
F(属性名)
可以在F()对象上使用算数运算
BookInfo.objects.filter(readcount__gt=F('commentcount')*2)
Q对象
- 多个过滤器逐个调用表示逻辑与关系,同sql语句中where部分的and关键字,如果需要实现逻辑或or的查询,需要使用Q()对象结合|运算符。(实际上Q对象,在我的理解就是相当于())
- Q对象可以使用&、|连接,&表示逻辑与,|表示逻辑或,Q对象前使用~操作符,表示非not
- 从django.db.models导入Q对象。语法如下:
-
from django.db.models import Q Q(属性名__运算符=值) BookInfo.objects.filter(Q(readcount__gt=20)|Q(id__lt=3))
聚合函数
- 使用aggregate()过滤器调用聚合函数,返回一个字典。
- 从django.db.models中导入聚合函数,包括:Avg,Count,Max,Min,Sum (注意这里第一个字母要大写)
跟聚合相关的还有一个count()函数 返回的是一个数字。
使用方法:
from django.db.models import Max BookInfo.objects.aggregate(Max('readcount')) BookInfo.objects.count()