zoukankan      html  css  js  c++  java
  • 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中引用这条数据的行都被删除了
    
  • 相关阅读:
    从“窃听门”事件解读手机Rootkit攻击
    一款好用的开源信息安全管理系统演示(视频)
    P1908-逆序对
    P1010-幂次方
    P1226-快速幂
    P1433-吃奶酪
    ACM模板——玄学逐字符输入输出
    P1434-滑雪
    P1118-数字三角形
    P1443-马的遍历
  • 原文地址:https://www.cnblogs.com/jabbok/p/9848741.html
Copyright © 2011-2022 走看看