django_ORM操作数据库
1 create
def add_area(request): area = Area.objects.create(name='commom',description='a commom area',manager='vicuic') return HttpResponse('added successfully') #具体的实现上,一般是web端使用post传递参数,然后再输入数据库,这里为了简便,所以直接设定值
2 select
什么是查询集?QuerySet
查询集,也称查询结果集、QuerySet,表示从数据库中获取的对象集合。
当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):
- all():返回所有数据。
- filter():返回满足条件的数据。
- exclude():返回满足条件之外的数据。
- order_by():对结果进行排序。
2.查询集特性:
一:惰性执行
创建all()等过滤方法时,数据库并不会进行实际查询
只有当真正使用时,如遍历的时候,才会真正去数据库进行查询
二:缓存
Django是动态网站,每次请求都会数据库中进行相应的操作。当访问量很大时,耗时就会增加。
缓存将某个views的返回值保存至内存或者memcache中,在设置的时间内,再有访问过来时,就不再执行view中的操作,而是直接从缓存中取值
缓存机制:每次有请求进来,先去看缓存是否有,有且未过期,直接拿值
如果缓存没有或者已过期,就要走视图,走数据库
def list_area(request): areas = Area.objects.all() #返回带所有结果的查询集
blog_list = BlogPost.objects.all().order_by('-timestamp') #返回所有结果的查询集,查询结果按照时间戳降序排列 #去掉-为升序 lines = models.UserInfo.objects.filter(username='jab',pwd='123123') #返回filter过滤的查询集
ret = list(config.objects.filter(id=id).values('dir'))[0] #objexts这个对象使用filter,返回查询集,然后values方法表示只要dir字段 #对查询集使用列表转换,然后取第一个数据
get()和filter()的区别:
get()返回的是一个models实例,如果没有get到则会抛出异常。
filter()返回的是查询集,相当于列表,如果没有fiter到,就返回{}。
如果只有一个匹配结果:
filter().fitst() = get()
filter()[0] = get()
values(*fields)
返回一个ValuesQuerySet —— QuerySet 的一个子类,迭代时返回字典而不是模型实例对象。
values() 接收可选的位置参数*fields,它指定SELECT 应该限制哪些字段。如果指定字段,每个字典将只包含指定的字段的键/值。如果没有指定字段,每个字典将包含数据库表中所有字段的键和值。
因为ManyToManyField
字段和反向关联可能有多个关联的行,包含它们可能导致结果集的倍数放大。如果你在values()
查询中包含多个这样的字段将更加明显,这种情况下将返回所有可能的组合。
user和roles是M2M, roles和perm也是M2M 这里就是查询一个user关联的所有roles,所关联的perm不是空的查询集。 为避免重复性,加入distinct() permission_menu_list = user.roles.filter(permissions__isnull=False).distinct().values( 'permissions__title', 'permissions__url', 'permissions__name', 'permissions__menu_id', # 菜单相关 'permissions__menu__title', 'permissions__menu__icon', 'permissions__parent_id', # 父权限相关 'permissions__parent__name' )
参考:
https://www.cnblogs.com/rgxx/p/10382664.html
3 update
def update_area(request): user = User.objects.get(username='vici') Area.objects.filter(name='lovely').update(manager=user) return HttpResponse('updated!') #Area的manager字段为User的外键,先获取特定的User行赋值给user,然后在Area的行中做行更新。 #user是一个class,这里用get获取,才能将user作为外键赋值给manager #如果用filter则返回一个查询集。无法赋值
4 delete
def delete_area(request): # Area.objects.filter(name='lovely').delete() User.objects.filter(username='vici').delete() return HttpResponse('deleted!') #由于Area的manager是User的外键,并且设置了级联删除,所以,当删除User中的一条数据,Area中引用这条数据的行都被删除了