Django9
上节回顾:
1 CBV,FBV
2 数据库操作
class UserType(models.Model):
title = models.CharField(max_length=32)
class UserInfo(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()
#在数据库里字段是ut_id
ut = models.ForeignKey("UserType")
-跨表 (都是前面的表,先取到,相当于#select * from userinfo left join usertype)
-正向
1. q = UserInfo.objects.all().first()
q.ug.title 在取的时候跨表 内部元素是对象
2.UserInfo.objects.values("nid","ug_id","ug__title") 在查的时候跨表 。内部元素字典
#select * from userinfo left join usertype
3.UserInfro.objects.values_list() 内部元素是元祖
-反向 对象:小写的表名_set
1.obj = UserGroup.objects.all().first()
result = obj.userinfo_set.all() [userinfo对象,userinfo对象]
2. 小写的表名称
v = UserType.objects.values("id","title")
v = UserType.objects.values("id","title","小写的表名称")
v = UserType.objects.values("id","title","小写的表名称__age")
3.小写的表名
v = UserType.objects.values_list("id","title")
v = UserType.objects.values("id","title","小写的表名称")
v = UserType.objects.values("id","title","小写的表名称__age")
跨表操作,PS:前面的表所有数据都会显示
其他:
Userinfo.objects.all()
Userinfo.objects.filter(id=1,name='cas')
Userinfo.objects.all().count()
Userinfo.objects.all().first()
Userinfo.objects.all().update()
Userinfo.objects.all().delete()
Userinfo.objects.all()[1:19]
跨表:
正向:
xxx.filter(ut__title="超级用户").values("id","name","ut__title")
反向:
xxx.filter(表名称__title="超级用户").values("id","name","表名称__title")
3. 分页组件
-内置
-自定义
ORM难点:
1.正反跨表
2.其他
3.性能
今日内容:
1.Django ORM(model)操作
1.-增删改查
-其他
2. 排序
user_list = models.UserInfo.objects.all().order_by("-id",'name') 排序 -id是降序
3.分组
from django.db.models import Count,Sum,Max,Min,avg 这是聚合函数
v = models.UserInfo.objects.values("ut_id").annotate(xxxx=Count('id')) 根据ut_id分组,分完组后计算个数。
print(v.query) queryset对象有query属性,可以查看他的sql生成语句
分组后二次筛选:
v = models.UserInfo.objects.values("ut_id").annotate(xxxx=Count('id')).filter(xxxx__gt=1) filter在后面,相当于having
v = models.UserInfo.objects.filter(id__gt=2).values("ut_id").annotate(xxxx=Count('id')).filter(xxxx__gt=1) filter在前面,相当于where
filter等字段,不仅可以填写这样的filter(id__gt=1),
还可以传入字典形式 condition = {"id":1,"name":"root",} filter(**condition)
4.基本操作
models.UserInfo.objects.filter(id__gte=1) #大于等于
models.UserInfo.objects.filter(id__lte=1) 小于等于
models.UserInfo.objects.filter(id__in=[1,2,3])
models.UserInfo.objects.filter(id__in=[1,2,3])
models.UserInfo.objects.filter(id__range=[1,2,3])
models.UserInfo.objects.filter(name__startwith='xxxx')
models.UserInfo.objects.filter(name__endwith="xxx")
models.UserInfo.objects.filter(name__contains="xxx")
#不等于 除id=1以外
models.UserInfo.objects.exclude(id=1)
#F,Q,extra
5.F:在跟新时,取到原来的值。
from django.db.models import F
models.UserInfo.objects.all().update(age=F("age")+1)
6.Q:用于构造复杂的查询条件
一个Q对象,就是个条件。
一种写法,以对象的方式
models.UserInfo.objects.filter(Q(id__gt=1) | Q(id=2)) or连接
models.UserInfo.objects.filter(Q(id=1) & Q(id=2)) and连接
另一种写法,以方法的方式。(做条件筛选的时候,多层)
# 方式二:
# con = Q()
# q1 = Q()
# q1.connector = 'OR'
# q1.children.append(('id'__gt, 1))
# q1.children.append(('id', 10))
# q1.children.append(('id', 9))
# q2 = Q()
# q2.connector = 'OR'
# q2.children.append(('c1', 1))
# q2.children.append(('c1', 10))
# q2.children.append(('c1', 9))
# con.add(q1, 'AND')
# con.add(q2, 'AND')
#
# models.Tb1.objects.filter(con)
7.extra 额外查询条件以及相关的表,排序
SQL语句:select name,title,(select count(1) form tb)as n from xb 一个查询结果当做字段
extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
參數怎麼用:
a.映射
select
select_params
相当于SQL语句:select 此處 from 表
b。条件
where
params
select * from 表 where 此处
c。表
tables
select * from 表,此处
d。排序
order_by
select * from 表 order_by 此处
他们可以综合使用,不冲突
modles.UserInfo.objects.extra(
select={'newid':'select count(1) from app01_usertype where id > %s'},
select_params=[1,],
where = ['age>%s'],
params=[18,],
order_by=['-age'],
tables=['app01_usertype']
)
相当于:
select
app01_userinfo.id,
(select count(1) from app01_usertype where id>1) as newid,
from app01_userinfo,app01_usertype
where
app01_userinfo.age > 18
order by
app01_userinfo.age desc
8.#原生SQL语句
# from django.db import connection, connections
# cursor = connection.cursor() 这就是连接默认的数据库,在seeting里面,database那里,名字为default那个数据库。
# cursor = connections['db2'].cursor()这是链接其他数据库。
# cursor.execute("""SELECT * from auth_user where id = %s""", [1])
# row = cursor.fetchone() fetchall()
9.简单的操作
all(self)所有元素是对象
filter(self,*args,**kwargs) 条件查询,条件可以是:参数,字典,Q
exclude(self,*args,**kwargs) 条件查询,条件可以是:参数,字典,Q
annotate(self,*args,**kwargs) 实现group by聚合
distinct
only('id','name') 返回的queryset内部还是obj,但是字段拿得少,不是all()
defer("name") 跟only反着的。
usering(self,alias) .using("db2")在setting里面可能有多个数据库。
上面的方法能够一直.点下去,因为都是queryset对象
下面的方法不能一直点
values(self,*fields) 获取每行数据为字典格式
values_list(self,*fields,**kwargs) 获取每行数据为元祖
date()
2.xss攻击
在html中写 |safe
后台:from django.utils.safestring import mark_safe
mark_safe(temp)
3.csrf
4.模板引擎
-部分内置方法
-自定义方法
posted on 2018-09-05 17:50 castiel_lee 阅读(98) 评论(0) 收藏 举报
浙公网安备 33010602011771号