djano一对一、多对多、分页实例代码


Posted in Python onAugust 16, 2019

昨日内容:

ORM高级查询

-filter
id=3
id__gt=3
id__lt=3
id__lte=3
id__gte=3

-in /not in
.filter(id__in=[]) in
.exclude(id__in=[]) not in

-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
from django.db.models import Q
Q和|连用为or
&为and


-order by
models.UserInfo.objects.all().order_by('id')#升序#('-id')则为降序
#若有2个值,则第一个先排序,第二个后排序

-group by
from django.db.models import Sum,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
from django.db import connection

-first
-last两个返回的都是对象
​
-only
返回值为列表里面套对象

-defer
除了某一列以外的其他对象,返回值为列表套对象、

-F
拿到某一列的值,但是只能进行数组操作

XSS -跨脚本(js)攻击

原因: 服务端太相信客户端传过来的参数

防止: 对客户端传过来的数据统一进行转译

django中自带转译 ​ 消除django中的转译 {{name|safe}} safe为相信

今日内容:

一对一

母表:userinfo

id name age
1 zekai 18
2 lxxx 58

private:
id salary sp_id(外键+unique)
1 5000 1
2 4000 2

一对一

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:
id name
1 laowang
2 XXX

girl:
id name
1 正正
2 连连
3 爱爱
4 凤姐
5 乔碧萝

boy2girl
id bid gid
1 1 1
2 1 2 
3 1 3
4 2 2
5 2 4
6 2 5

models.py:
class Boy(models.Model):
bname=models.CharField(max_length=32,null=True)
​
class Girl(models.Model):
gname=models.CharField(max_length=32,null=True)
​
class Boy2Girl(models.Model):
b = models.ForeignKey("Boy",null=True)
g = models.ForeignKey("Girl",null=True)
​
​
#联合唯一索引
class Meta:
unique_together=[
('b','g')
]


views.py:
def test1(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),
]
​
​
​
return HttpResponse('ok')
查询:需求,查找和雷俊约会的姑娘
res = models.Boy2Girl.objects.filter(bname='雷俊').first()
love_list = res.boy2girl_set.all()
for love in love_list:
print(love.g.name)
​

res = models.Boy2Girl.objects.filter(b__bname='雷俊') #[obj,obj...]
for love in res:
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

-django admin

  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:数据库中字段是否可以建立唯一索引

分页

-内置分页

from django.core.paginator import Paginator
  #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)
  
  return render(request,'index.html',{"users":users})
​
-自定制分页

class PageInfo():
  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)
    if b:
      a = a + 1
    self.total_page = a  #### 总页数
​
  #### 获取起始索引
  def get_start(self):
    start = (self.cur_page - 1) * self.per_page
    return start
  #### 获取结束索引
  def get_end(self):
    return self.cur_page * self.per_page
​
  def get_page(self):
​
    half = (self.show_page - 1) // 2
​
    #### taotal_page = 5 < show_page = 11
    if self.total_page < self.show_page:
      begin = 1
      end = self.total_page
    else:
      #### 左边极值判断
      if self.cur_page - half <= 0 :
        begin = 1
        # end = self.cur_page + half
        end = self.show_page
      #### 右边极值的判断
      elif self.cur_page + half > self.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 = []
    if self.cur_page == 1:
      astr = "<li><a href='#' aria-label='Previous'><span aria-hidden='true'>«</span></a></li>"
    else:
      astr = "<li><a href='/custom/?cur_page=%s' aria-label='Previous'><span aria-hidden='true'>«</span></a></li>" % (self.cur_page-1)
    page_list.append(astr)
​
    for i in range(begin, end + 1):
      if self.cur_page == i:
        # astr = "<a style='display:inline-block; padding:5px;margin:5px;background-color:red;' href='/custom/?cur_page=%s'>%s</a>" % (i, i)
        astr = "<li class='active'><a href='/custom/?cur_page=%s'>%s</a></li>" % (i, i)
      else:
        # astr = "<a style='display:inline-block; padding:5px;margin:5px' href='/custom/?cur_page=%s'>%s</a>" % (i, i)
        astr = "<li><a href='/custom/?cur_page=%s'>%s</a></li>" % (i, i)
      page_list.append(astr)
​
    if self.cur_page == self.total_page:
      astr = "<li><a href='#' aria-label='Next'><span aria-hidden='true'>»</span></a></li>"
    else:
      astr = "<li><a href='/custom/?cur_page=%s' aria-label='Next'><span aria-hidden='true'>»</span></a></li>" % (self.cur_page+1)
    page_list.append(astr)
​
    s = " ".join(page_list)
​
    return s
​
def custom(request):
​
  cur_page = request.GET.get('cur_page')
  cur_page = int(cur_page)
​
  '''
  mysql:
    seelct * from userinfo limit 0, 10 
    seelct * from userinfo limit 10, 10 
    
    cur_page  start  show_page
     1     0   10
     2     10  10
     3     20  10
     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 = 1  start = 0  end = 10
  ### cur_page = 2  start = 10 end = 20
  ### cur_page = 3  start =20 end = 30
  # user_list = models.UserInfo.objects.all()[start:end]
  user_list = models.UserInfo.objects.filter(id__lte=44)[start:end]
​
​
  return render(request, "custom.html", {"user_list":user_list, "page":page})

安全攻击

  • -XSS
  • -csrf
  • -sql注入

以上就是本次介绍的全部相关知识点,感谢大家对三水点靠木的支持。

Python 相关文章推荐
分析Python的Django框架的运行方式及处理流程
Apr 08 Python
分享Python文本生成二维码实例
Jan 06 Python
使用简单工厂模式来进行Python的设计模式编程
Mar 01 Python
在Django同1个页面中的多表单处理详解
Jan 25 Python
python基础之入门必看操作
Jul 26 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
Python和Java进行DES加密和解密的实例
Jan 09 Python
pandas删除指定行详解
Apr 04 Python
解决pycharm remote deployment 配置的问题
Jun 27 Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 Python
Python如何测试stdout输出
Aug 10 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 Python
python try except返回异常的信息字符串代码实例
Aug 15 #Python
python 多进程共享全局变量之Manager()详解
Aug 15 #Python
使用Python调取任意数字资产钱包余额功能
Aug 15 #Python
centos7之Python3.74安装教程
Aug 15 #Python
详解python列表(list)的使用技巧及高级操作
Aug 15 #Python
django项目中使用手机号登录的实例代码
Aug 15 #Python
python基于pdfminer库提取pdf文字代码实例
Aug 15 #Python
You might like
php 模拟POST提交的2种方法详解
2013/06/17 PHP
Linux编译升级php的详细方法
2013/11/04 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
JS无法捕获滚动条上的mouse up事件的原因猜想
2012/03/21 Javascript
jQuery通过点击行来删除HTML表格行的实现示例
2014/09/10 Javascript
JavaScript实现向OL列表内动态添加LI元素的方法
2015/03/21 Javascript
JavaScript输出当前时间Unix时间戳的方法
2015/04/06 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
JS实现简单易用的手机端浮动窗口显示效果
2016/09/07 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
AngularJS1.X学习笔记2-数据绑定详解
2017/04/01 Javascript
3分钟掌握常用的JS操作JSON方法总结
2017/04/25 Javascript
bootstrap栅格系统示例代码分享
2017/05/22 Javascript
jquery Form轻松实现文件上传
2017/05/24 jQuery
js 中rewrap-ajax.js插件实例代码
2017/10/20 Javascript
vue实现组件之间传值功能示例
2018/07/13 Javascript
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
详解vue 自定义marquee无缝滚动组件
2019/04/09 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
[04:40]2016个国际邀请赛中国区预选赛场地——华西村观战指南
2016/06/25 DOTA
[56:12]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第一场 6.3
2018/06/04 DOTA
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
Python基于分析Ajax请求实现抓取今日头条街拍图集功能示例
2018/07/19 Python
使用django自带的user做外键的方法
2020/11/30 Python
matplotlib事件处理基础(事件绑定、事件属性)
2021/02/03 Python
使用html5制作loading图的示例
2014/04/14 HTML / CSS
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
售后服务经理岗位职责
2014/02/25 职场文书
学校对教师的评语
2014/04/28 职场文书
MySQL 十大常用字符串函数详解
2021/06/30 MySQL