djano一对一、多对多、分页实例代码
昨日内容:
ORM高级查询
-filter
id=3
id__gt=3
id__lt=3
id__lte=3
id__gte=3
-in/notin
.filter(id__in=[])in
.exclude(id__in=[])notin
-between......and
.filter(id__range=[])
-like
.filter(name__startswith='XX')like'XX%'
.filter(name_istartswith='XX')#忽略大小写
.filter(name__endswith='XX')like'%XX'
.filter(name__contains='XX')like'%XX%'
.filter(name_regax='^XX$')like'%XX%'精准匹配
-or
fromdjango.db.modelsimportQ
Q和|连用为or
&为and
-orderby
models.UserInfo.objects.all().order_by('id')#升序#('-id')则为降序
#若有2个值,则第一个先排序,第二个后排序
-groupby
fromdjango.db.modelsimportSum,Count,Min,Max
models.UserInfo.objects.values('name').annota1te(xx=Sum('age'))
models.UserInfo.objects.values('name').annota1te(xx=Sum('age')).filter(XX__gt=50)#二次筛选
-count
models.UserInfo.objects.count()
-limit分页
models.UserInfo.objects.all()[X,XX]#利用切分来分页
-distinct
models.UserInfo.objects.values('XX').distinct()
-原生SQL
fromdjango.dbimportconnection
-first
-last两个返回的都是对象
-only
返回值为列表里面套对象
-defer
除了某一列以外的其他对象,返回值为列表套对象、
-F
拿到某一列的值,但是只能进行数组操作
XSS-跨脚本(js)攻击
原因:服务端太相信客户端传过来的参数
防止:对客户端传过来的数据统一进行转译
django中自带转译消除django中的转译{{name|safe}}safe为相信
今日内容:
一对一
母表:userinfo
idnameage 1zekai18 2lxxx58 private: idsalarysp_id(外键+unique) 150001 240002
一对一
OneToOneField("表名",null=True)默认要求该字段必须是唯一的unique外键关系
#从母表查询子表的数据
查询一下name='zekai'的这条数据
res=models.UserInfo.objects.filter(name='zekai').first() print(res.private.salary) #res.子表表名小写.子表字段名
#从字表查询母表中的数据
查询salary=5000的这个数据所对应的用户的信息
res=models.Private.objects.filter(salary=5000).first() print(res.sp.name,res.sp.age) #res.关联的字段名.母表字段名
多对多
相亲模型
boy:
idname
1laowang
2XXX
girl:
idname
1正正
2连连
3爱爱
4凤姐
5乔碧萝
boy2girl
idbidgid
111
212
313
422
524
625
models.py:
classBoy(models.Model):
bname=models.CharField(max_length=32,null=True)
classGirl(models.Model):
gname=models.CharField(max_length=32,null=True)
classBoy2Girl(models.Model):
b=models.ForeignKey("Boy",null=True)
g=models.ForeignKey("Girl",null=True)
#联合唯一索引
classMeta:
unique_together=[
('b','g')
]
views.py:
deftest1(rsquest):
boyinfo=[
models.Boy(bname='雷俊'),
models.Boy(bname='雷鸣'),
models.Boy(bname='雷公'),
models.Boy(bname='雷军'),
models.Boy(bname='雷峰'),
]
girlinfo=[
models.Girl(gname='真真'),
models.Girl(gname='天天'),
models.Girl(gname='爱爱'),
models.Girl(gname='凤姐'),
models.Girl(gname='乔碧萝'),
]
models.Girl.objects.bulk_create(boyinfo)
b2ginfo=[
models.Boy2Girl(b_id=1,g_id=1),
models.Boy2Girl(b_id=2,g_id=4),
models.Boy2Girl(b_id=3,g_id=3),
models.Boy2Girl(b_id=4,g_id=5),
models.Boy2Girl(b_id=5,g_id=2),
models.Boy2Girl(b_id=3,g_id=5),
models.Boy2Girl(b_id=5,g_id=4),
]
returnHttpResponse('ok')
查询:需求,查找和雷俊约会的姑娘
res=models.Boy2Girl.objects.filter(bname='雷俊').first()
love_list=res.boy2girl_set.all()
forloveinlove_list:
print(love.g.name)
res=models.Boy2Girl.objects.filter(b__bname='雷俊')#[obj,obj...]
forloveinres:
print(res.g.name)
res=models.Boy2Girl.objects.filter(b__bname='雷俊').values('g__gname')
print(res)#[{},{}...]
第一种方式:手动创建第三张表
models.py
views.py
第二种方式:manytomanyfield
models.py
view.py
区别:
第一种方式比较灵活
第二种方式比较死板但是如果将来业务扩展的时候,就需要重新打破重来
因此推荐使用第一种,自定义创建第三张表
表中数据类型
-mysql
-djangoadmin
| mysql | django | |
|---|---|---|
| 数字 | tinyint | 不存在 |
| smallint | SmallInterField | |
| mediumint | 不存在 | |
| int | integerFieled/PositiveIntegerField | |
| bignt | BigInterField/PositiveBigIntegerField | |
| decimal | DecimalField | |
| float | FloatField | |
| double | 不存在 |
| mysql | django | |
|---|---|---|
| 字符串 | char | 不存在 |
| varchar | CharField | |
| text | TextField | |
| 时间日期 | date | DateField |
| datetime | DatetimeField | |
参数:
null数据库中字符段是否为空
db_column:数据库中字段的列名
default:数据库中字段的默认值
primary_key:字段是否为主键
unique_together:联合唯一索引
index_together:联合索引
db_index:数据库中字段是否可以建立索引
unique:数据库中字段是否可以建立唯一索引
分页
-内置分页
fromdjango.core.paginatorimportPaginator
#per_page:每页显示条目数量
#count:数据总个数
#num_pages:总页数
#page_range:总页数的索引范围
#page:page对象
paginator=Paginator(userlist,10)
#has_next:是否有下一页
#next_page_number:下一页页码
#has_previous:是否有上一页
#previous_page_number:上一页页码
#object_list:分页之后的数据列表
#number:当前页
#paginator:paginator对象
sers=paginator.page(cur_page)
returnrender(request,'index.html',{"users":users})
-自定制分页
classPageInfo():
def__init__(self,cur_page,total,per_page=10,show_page=11):
self.cur_page=cur_page
self.per_page=per_page
self.total=total
self.show_page=show_page
a,b=divmod(self.total,self.per_page)
ifb:
a=a+1
self.total_page=a####总页数
####获取起始索引
defget_start(self):
start=(self.cur_page-1)*self.per_page
returnstart
####获取结束索引
defget_end(self):
returnself.cur_page*self.per_page
defget_page(self):
half=(self.show_page-1)//2
####taotal_page=5self.total_page:
#begin=self.cur_page-half
begin=self.total_page-self.show_page+1
end=self.total_page###31
####正常页码判断
else:
begin=self.cur_page-half
end=self.cur_page+half
page_list=[]
ifself.cur_page==1:
astr="« "
else:
astr="« "%(self.cur_page-1)
page_list.append(astr)
foriinrange(begin,end+1):
ifself.cur_page==i:
#astr="%s"%(i,i)
astr="%s"%(i,i)
else:
#astr="%s"%(i,i)
astr="%s "%(i,i)
page_list.append(astr)
ifself.cur_page==self.total_page:
astr="» "
else:
astr="» "%(self.cur_page+1)
page_list.append(astr)
s="".join(page_list)
returns
defcustom(request):
cur_page=request.GET.get('cur_page')
cur_page=int(cur_page)
'''
mysql:
seelct*fromuserinfolimit0,10
seelct*fromuserinfolimit10,10
cur_pagestartshow_page
1010
21010
32010
n(n-1)*10,10
limit(cur_page-1)*show_page
'''
#total=models.UserInfo.objects.count()
total=models.UserInfo.objects.filter(id__lte=44).count()
page=PageInfo(cur_page,total)
start=page.get_start()
end=page.get_end()
###cur_page=1start=0end=10
###cur_page=2start=10end=20
###cur_page=3start=20end=30
#user_list=models.UserInfo.objects.all()[start:end]
user_list=models.UserInfo.objects.filter(id__lte=44)[start:end]
returnrender(request,"custom.html",{"user_list":user_list,"page":page})
安全攻击
- -XSS
- -csrf
- -sql注入
以上就是本次介绍的全部相关知识点,感谢大家对毛票票的支持。