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切换hosts文件代码示例
Dec 31 Python
python编程开发之类型转换convert实例分析
Nov 13 Python
使用Python来开发Markdown脚本扩展的实例分享
Mar 04 Python
Python中扩展包的安装方法详解
Jun 14 Python
python ansible服务及剧本编写
Dec 29 Python
python根据unicode判断语言类型实例代码
Jan 17 Python
python简单鼠标自动点击某区域的实例
Jun 25 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
如何搭建pytorch环境的方法步骤
May 06 Python
PyPDF2读取PDF文件内容保存到本地TXT实例
May 12 Python
Scrapy框架介绍之Puppeteer渲染的使用
Jun 19 Python
详解Python yaml模块
Sep 23 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
在WIN98下以apache模块方式安装php
2006/10/09 PHP
php垃圾代码优化操作代码
2010/08/05 PHP
CI框架学习笔记(一) - 环境安装、基本术语和框架流程
2014/10/26 PHP
PHP基于yii框架实现生成ICO图标
2015/11/13 PHP
ThinkPHP3.2.2实现持久登录(记住我)功能的方法
2016/05/16 PHP
Ajax PHP JavaScript MySQL实现简易无刷新在线聊天室
2016/08/17 PHP
php图像处理函数imagecopyresampled用法详解
2016/12/02 PHP
javascript dom 操作详解 js加强
2009/07/13 Javascript
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
浅谈angularjs $http提交数据探索
2017/01/20 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
2017/03/04 Javascript
angular ng-click防止重复提交实例
2017/06/16 Javascript
jQuery中的$是什么意思及 $. 和 $().的区别
2018/04/20 jQuery
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
vue 项目 iOS WKWebView 加载
2019/04/17 Javascript
vue3修改link标签默认icon无效问题详解
2019/10/09 Javascript
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
Python线程的两种编程方式
2015/04/14 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
2017/05/03 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
2017/05/19 Python
Django JWT Token RestfulAPI用户认证详解
2019/01/23 Python
python turtle 绘制太极图的实例
2019/12/18 Python
解决Jupyter notebook中.py与.ipynb文件的import问题
2020/04/21 Python
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
Lime Crime官网:美国一家主打梦幻精灵系的彩妆品牌
2019/03/22 全球购物
The Body Shop美体小铺西班牙官网:天然化妆品
2019/06/21 全球购物
恶搞卫生巾广告词
2014/03/18 职场文书
民族学专业职业生涯规划范文:积跬步以至千里
2014/09/11 职场文书
标准离婚协议书(2014版)
2014/10/05 职场文书
八年级地理课件资料及考点知识分享
2019/08/30 职场文书
Golang 链表的学习和使用
2022/04/19 Golang