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中引用这条数据的行都被删除了

 

posted @ 2018-10-25 11:27  jabbok  阅读(924)  评论(0编辑  收藏  举报