zoukankan      html  css  js  c++  java
  • Python Day 60 Django框架、ORM高级查询、级联删除、增加多条数据、Django中Xss攻击、事务

      ##基本查询

    # 基本的查询
        res = models.Student.objects.all().first()
        print(res)
        # 返回的是QuerySet  列表中套对象
        res = models.Student.objects.values("name").first()
        print(res)
        # 返回的是QuerySet  列表中套字典
        res = models.Student.objects.values_list("name")
        print(res)
        # 返回的是QuerySet  列表中套元组
    
        # 当然,这写查询后面都可以跟上.first()取列表中的第一个

      ##高级查询

    # 高级查询
    # 1. in     通过 字段名__in = [1,2]  查询
        res = models.Student.objects.filter(age__in=[12,14,42]).all()
    
    # 2. not in  通过exclude(字段名__in = [1,2])  exclude就是除了的意思
        res = models.Student.objects.exclude(age__in=[12,14,42]).all()
    
    # 3. like 通配查询
        # where name like "李%"  # 代表查询名字以李开头的所有
        # name__istartswith  表示不区分大小写,以什么什么为开头
        res = models.Student.objects.filter(name__startswith="").all()
    
        # where name like "%白"  # 表示匹配以白结尾的所有单词
        # name__iendswith   表示不区分大小写,以什么什么为结尾
        res = models.Student.objects.filter(name__endswith="").all()
    
        # where name like "%小%" 表示匹配中间有 小 字的所有单词
        # name__icontains   表示不区分大小写,包含什么什么的单词
        res = models.Student.objects.filter(name__contains="").all()
    
    # 4. between .. and...  通过  列名__range = [开始位置,结束位置]   闭区间
        res = models.Student.objects.filter(id__range=[2,5]).all()
    
    # 5. limit  通过索引进行切片[10:20]  代表从10取到20  前闭后开
        res = models.Student.objects.all()[5:7]
    
    # 6. order by     通过order by 方法, 前面加"-"就是降序,默认升序
        res = models.Student.objects.order_by("id").all()
    
        # 可以多次排序  先按age字段降序,如果age相同,就按id字段升序
        res = models.Student.objects.order_by("-age","id").all()
    
    # 7. group by
        # 分组需要用到django中的方法
        from django.db.models import Count, Max, Min, Sum
        res = models.Student.objects.values("name").annotate(xxx=Count("id"))
        # 表示的是搜索name字段和对表的id字段计算count,并起了别名为xxx   通过name字段进行分组,可使用# print(res.query)查看sql的语句
       # SELECT "app01_student"."name", COUNT("app01_student"."id") AS "xxx" FROM "app01_student" GROUP BY "app01_student"."name"
    
    # 8. only 只取某列的值
        res = models.Student.objects.only("name","age").all()
        # 取出来是QuerySet 列表里面包含对象,对象中包含name字段的值以及id列的值
        # 和values取值的区别就是only取出来的是列表套对象,values取的是列表套字典
        # 并且,不管你only中是否包含id字段,他都会把你的id字段一并取出来
    
    # 9. defer 取出除了某列以外其他列的值
        res = models.Student.objects.defer("id","name").all()
        # 取出来的也是列表套对象,并且,不管你里面有没有id字段,都会把你id列的值取出来
    
    # 10. using
        # 我们在配置数据库时,会把数据库添加到DATABASES 中
        # DATABASES = {
        #     'default': {
        #         'ENGINE': 'django.db.backends.sqlite3',
        #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        #     }
        # }
        # 如果里面连有多个数据库,就可以通过using来确定使用哪一个数据库
        res = models.Student.objects.all().using("default")
    
    # 11. 查询表中一共有多少条数据
        res = models.Student.objects.count()
    
    # 12. 第一条数据
        res = models.Student.objects.first()
    
    # 13. 最后一条数据
        res = models.Student.objects.last()
    
    # 14. gt 大于  lt 小于  gte 大于等于  lte 小于等于
        res = models.Student.objects.filter(id__gt=8).all()
    
        res = models.Student.objects.filter(id__lte=8).all()
    
    # 15. and 操作    ,  在filter中用逗号隔开就是and
        res = models.Student.objects.filter(id=2,age=23)
        # 返回的还是QuerySet 类型
    
    # 16. or 操作
        # or 需要从django中导入Q方法
        from django.db.models import Q
        res = models.Student.objects.filter(Q(id=2) | Q(age=12))
    
        res = models.Student.objects.filter(Q(Q(id=2) | Q(age=12)) & Q(name="李铁柱"))
        #   | 表示 或   & 表示 与
    
    # 17. 在原有的基础上更新,比如我想让某一列的值整体 + 1
        # 需要从django中导入F方法
       Django 支持 F() 对象之间以及 F() 对象和常数之间的加减乘除和取模的操作
    from django.db.models import F models.Student.objects.update(F("age") + 1) # 这样age字段就会全部 + 1 # 18. 原生sql语句 # django也给我们提供了写原生sql的方法 from django.db import connection # 导入连接 cursor = connection.cursor() # 生成cursor对象 cursor.execute() # 可以提交sql语句,也可以传参数 cursor.fetchall() # 拿取所有的结果 cursor.fetchone() # 拿取一条结果 models.Student.objects.raw() # 这个方法也可以提交sql语句,不建议使用 #注意: 1. orm能实现的功能, 尽量使用orm实现 2. 不建议大家以后再自己的业务逻辑中, 混着用

      ##增和删的补充

    #
    
    # 一次增加一条数据
    models.Student.objects.create(name="xxx",age=12)
    
    # 一次增加多条数据
    
    obj = [
        models.Student(name="qqq",age=12),
        models.Student(name="aaa",age=32),
        models.Student(name="www",age=21)
    ]
    models.Student.objects.bulk_create(obj)
    
    # 删除
    
    models.Student.objects.filter(name="xxx").delete()
    # 如果是单表删除没有问题,但如果这张表的主键和别的表建立了外键关系,删除这条数据,另一张表对应的数据也会被删除掉
    # 这也称为级联删除,如果我们不需要这样,可以在建外键是给on_delete赋值
    # on_delete 几个参数的含义
        # CASCADE  默认值   级联删除
        # SET_NULL 取消级联删除,如果被关联外键的一条数据删除,关联的对应值用NULL代替,所以需要支持NULL
        # SET_DEFAULT  取消级联删除,被删除就用默认值代替
    
    class Student(models.Model):
        name = models.CharField(max_length=32)
        teac = models.ForeignKey('Teacher', null=True, on_delete=models.SET_NULL)

       ##Django中Xss攻击

    全程:跨站脚本(js)攻击
        
        原因:
            用户输入的内容不可控、导致用户输入的数据被浏览器解析而导致代码修改
            
            eg:<script>1.获取用户的cookie 2. 发送这个cookie到黑客的数据库</script>
    
    views.py:
                    
        msg = []
        def comment(request):
            if  request.method == 'GET':
                return render(request, "comment.html")
            else:
                comment = request.POST.get('comment')
                msg.append(comment)
                return render(request, "comment.html")
    
        def  show(request):
            return render(request, 'show.html', {"msg":msg})
    
    comment.html:
        <form action="/comment/" method="post">
            <input type="text" name="comment">
            <input type="submit" value="提交">
        </form>
    
    show.html:
            <ul>
                {% for item in msg %}
                    <li>{{ item | safe }}</li>
                {% endfor %}
            </ul>
    
    
     #注意:| safe  默认是关闭的、为了验证效果手动开启

       ##事务

    事务的定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性(NoSQL数据库对于事务则是部分支持)
    
    # 事务
        # 买一本 跟老男孩学Linux 书
        # 在数据库层面要做的事儿
        # 1. 创建一条订单数据
        # 2. 去产品表 将卖出数+1, 库存数-1
        from django.db.models import F
        from django.db import transaction
        # 开启事务处理
        try:
            with transaction.atomic():
                # 创建一条订单数据
                models.Order.objects.create(num="110110111", product_id=1, count=1)
                # 能执行成功
                models.Product.objects.filter(id=1).update(kucun=F("kucun")-1, maichu=F("maichu")+1)
        except Exception as e:
            print(e)
  • 相关阅读:
    Leetcode Binary Tree Level Order Traversal
    Leetcode Symmetric Tree
    Leetcode Same Tree
    Leetcode Unique Paths
    Leetcode Populating Next Right Pointers in Each Node
    Leetcode Maximum Depth of Binary Tree
    Leetcode Minimum Path Sum
    Leetcode Merge Two Sorted Lists
    Leetcode Climbing Stairs
    Leetcode Triangle
  • 原文地址:https://www.cnblogs.com/liangzhenghong/p/11203427.html
Copyright © 2011-2022 走看看