今日所讲内容:
一、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攻击
跨站请求伪造