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)
  • 相关阅读:
    虎虎的小尾巴:期货套利的入门——全文干货(2020-05-10)
    虎虎的小尾巴:对化工板块的一些思考(2020-05-06)
    虎虎的小尾巴:本周小结(2020-04-30)
    虎虎的小尾巴:耐得住寂寞,经得住诱惑(2020-04-24)
    虎虎的小尾巴:first blood(2020-04-19)
    虎虎的小尾巴:财不入急门(2020-04-15)
    虎虎的小尾巴:再谈仓位管理的重要性(2020-04-7)
    学习Linux系列--布署常用服务
    学习Linux系列--安装软件环境
    Asp.Net运行于32/64模式下的性能差异
  • 原文地址:https://www.cnblogs.com/liangzhenghong/p/11203427.html
Copyright © 2011-2022 走看看