7.16—062—周二

今日所讲内容:

    一、djiango orm 的配置

    二、orm 的基本操作

      基本的增删改查 | 高级查询

    三、Xss 攻击:跨站脚本(js)攻击

 

一、djiango orm 的配置

    1、首先创建数据库

    2、 settings: 

      default: mysql配置链接  

DATABASES = {
  '
default': {   

    'ENGINE': 'django.db.backends.mysql',   

    'NAME': 's8day61', ## 数据库名称   

    'USER': 'root',   

    'PASSWORD': '000000', ## 安装 mysql 数据库时,输入的 root 用户的密码   

    'HOST': '127.0.0.1',   }

}

 

    3、注册:install_app: app01

    4、 __init__.py:
      import pymysql
      pymysql.install_as_mysqldb    

    5、在models.py中创表:
      class UserType(models.Model):
        title= models.Charfiled(max_legnt=32)
      class Userinfo(models.MOdel):
        ### id不用写, 自动生成
        name = models.Charfiled(max_legnt=32)
        ut = models.ForeignKey('UserType') ### ut_id

    6、class建好后在terminal中(和命令行一样)

      python3 mange.py makemigrations ## 生成migrations文件

      python3 mange.py migrate ### 根据生成的migrations文件生成表

二、orm 的基本操作

  1、基本的增删改查  (重点)

    增 

      models.Userinfo.objects.create(name='xxxx')

      obj = [
        models.UserInfo(name='aaa', age=12),
        models.UserInfo(name='bbb', age=13),
        models.UserInfo(name='ccc', age=14),
        ]
      models.UserInfo.objects.bulk_create(obj)

    删

      models.xxxx.objects.all().delete()
      models.xxxx.objects.filter(name='kkk').delete()

    改

      models.userinfo.objects.filter(xxxx).update()

    查  (.first() | .last() | .all())

      models.userinfo.objects.all()   ——[{}]

      models.userinfo.objects.values('name').all()   ——[{}]

      models.userinfo.objects.value_list('name').all() ——[()]

  一对一

    绑定只能出现一次

 

    查:
      正向查询(子表查母表):
      1.11.22 :res.us.name
      1.11.10 : res.母表表名小写.name
        res = models.Salary.objects.filter(money="3000").first()
        print(res.us.name)

      反向查询(母表查子表)
        obj.子表小写.子表列名 : res.salary.money
        res = models.UserInfo.objects.filter(name='zekai').first()
        print(res.salary.money)

  2、一对多

     通过外键正向查询

      res=models。userinfo.objects.filter(id__lt=1)

      res通过外键点出另一张表中的列名

      res.title

     反向查询

      res = models.UserType.objects.all()

      for obj in res:

        obj.userinfo_set.all()

     跨表查询( __ 双下划线)

      res = models.UserInfo.objects.values('name', "ut__title")

  3、多对多

    增  (外键增加)

      obj = models.Boy.objects.filter(name='aaa').first()
      obj.g.add(3)
      # obj.g.add(*[1,2])

    删

      models.xxxx.objects.all().delete()
      models.xxxx.objects.filter(name='kkk').delete()

     补充:外键删除时on_delete默认是CASCADE
      ut = models.ForeignKey("UserType", null=True, on_delete=models.CASCADE)
        CASCADE: 设置级联删除
        SET_NULL : 取消级联删除

    重置

      obj = models.Boy.objects.filter(name='aaa').first()

      obj.g.set([4])

    查 (连表查)

      res = models.Love.objects.filter(b__name='aaa').values("g__nick")

  4、高级查询     (重点)

    0)__lt= | __lte= | __gt= | __gte= 

      models。userinfo.objects.filter(id__lt=1)

    1)in——not in

      res = models.UserInfo.objects.filter(id__in=[1,2,3])

      res = models.UserInfo.objects.exclude(id__in=[1,2,3])

    2)like (通配符)

       以“XX”开头的所有的数据 :where name like 'xx%' 
      startswith: 以 某单词开头      |       istartswith : ignore (忽略) 以 某单词开头 忽略大小写    

      以“XX”结尾的所有的数据: where name like '%xx' 
      endswith : 以 某个单词结尾      |      iendswith: ignore (忽略) 以 某单词结尾 忽略大小写  

      中间包含“XX”的所有的数据: where name like  "%xx%"
      contains : 包含某一个单词       |      icontains: 包含某一个单词 不区分大小写

        res = models.UserInfo.objects.filter(name__startswith="xx"

        res = models.UserInfo.objects.filter(name__endswith='xx')

        models.UserInfo.objects.filter(name__contains='xx')

    3)between ... and ...  (在区间内)

      models.UserInfo.objects.filter(id__range=[1,2])

    4)limit 10, 20

      models.UserInfo.objects.all()[开始位置:结束位置]
      models.UserInfo.objects.all()[0:10]
      models.UserInfo.objects.all()[10:20]

    5)order by  | age asc, name desc

      res = models.UserInfo.objects.all().order_by('id')        #  默认升序
      res = models.UserInfo.objects.all().order_by('-id','name')    # 前面加一个 ‘-’ 代表 降序
      print(res.query)                         # 对象.query可以查看原生sql语句

    6)group by ... filter(相当于having) ...

      from django.db.models import Count, Max, Min, Sum
      res = models.UserInfo.objects.values('name').annotate(xxx=Count('id'))

      res = models.UserInfo.objects.values('name').annotate(xxx=Count('id'))filter(xx__lt=3)
      print(res.query)  

        # SELECT "app01_userinfo"."id", COUNT("app01_userinfo"."name") AS "xxx"FROM "app01_userinfo"GROUP BY "app01_userinfo"."id";

    7)only: 只取某一个列的值  但会默认取id

      res = models.UserInfo.objects.only('name', 'age').all()

    8)defer: 除了这几列之外的所有列的值

      res = models.UserInfo.objects.defer('id','name', 'age').all()
      print(res.query)

    9)using: 想要使用哪个数据库, 就将这个数据库的配置名称写到using中 修改数据库

      models.UserInfo.objects.all().using("xxxx")

    10)count:表中总共多少条数据

      res = models.UserInfo.objects.count()

    11)第一条与最后一条数据

      第一条:res = models.UserInfo.objects.first()

      最后一条:res = models.UserInfo.objects.last()

    12)and 操作 两个条件之间用 "," 连接

      res = models.UserInfo.objects.filter(id=1, name='zekai')
      print(res.query)

    13)or操作

      from django.db.models import Q

      res = models.UserInfo.objects.filter( Q(Q(id=1) | Q(name='zekai')) & Q(name='xxxx') )
      print(res.query)

    14)在原来的基础上更新值 (底层把str转成了int)   

      from django.db.models import F
      models.UserInfo.objects.update(age = F('age') + 1)

    15)原生sql

      方法一

        from django.db import connection

        cursor = connection.cursor()
        cursor.execute("select * from app01_userinfo where id=%s", [1,])
        res = cursor.fetchall()  |  res = cursor.fetchone()
        print(res)  

      方法二
        models.UserInfo.objects.raw('select * from app01_userinfo')

三、Xss 攻击:跨站脚本(js)攻击

  原因:用户输入的内容不可控,用户输入的是 js 语言,如果没有加以限制或判断就会造成要显示的内容直接运行

  例:<script>1.获取用户的cookie 2. 发送这个cookie到黑客的数据库</script>

  CSRF攻击

    跨站请求伪造

  

 

 

 

转载于:https://www.cnblogs.com/Chinesehan/p/11196912.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值