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中的hashlib和base64加密模块使用实例
Sep 02 Python
Python常用内置函数总结
Feb 08 Python
简介Django中内置的一些中间件
Jul 24 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
Python使用Selenium爬取淘宝异步加载的数据方法
Dec 17 Python
详解Selenium+PhantomJS+python简单实现爬虫的功能
Jul 14 Python
python实现QQ邮箱发送邮件
Mar 06 Python
python标准库OS模块详解
Mar 10 Python
python logging.info在终端没输出的解决
May 12 Python
Python基于gevent实现高并发代码实例
May 15 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
10行Python代码实现Web自动化管控的示例代码
Aug 14 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实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
使用PHPMYADMIN操作mysql数据库添加新用户和数据库的方法
2010/04/02 PHP
PHP弹出提示框并跳转到新页面即重定向到新页面
2014/01/24 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
Javascript 阻止javascript事件冒泡,获取控件ID值
2009/06/27 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
jQuery技巧总结
2011/01/01 Javascript
JavaScript Math.floor方法(对数值向下取整)
2015/01/09 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
工作中常用的js、jquery自定义扩展函数代码片段汇总
2016/12/22 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
get  post jsonp三种数据交互形式实例详解
2017/08/25 Javascript
angularJS1 url中携带参数的获取方法
2018/10/09 Javascript
vue.draggable实现表格拖拽排序效果
2018/12/01 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
webstorm建立vue-cli脚手架的傻瓜式教程
2020/09/22 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
python在windows和linux下获得本机本地ip地址方法小结
2015/03/20 Python
python自动翻译实现方法
2016/05/28 Python
python3调用R的示例代码
2018/02/23 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
浅谈python 读excel数值为浮点型的问题
2018/12/25 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
Python+OpenCV图像处理—— 色彩空间转换
2020/10/22 Python
python statsmodel的使用
2020/12/21 Python
实习教师自我鉴定
2013/09/27 职场文书
幼儿园教师工作制度
2014/01/22 职场文书
中考标语大全
2014/06/05 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
授权委托书协议书
2014/10/16 职场文书
学前班学生评语
2014/12/29 职场文书
2015年庆祝国庆节66周年演讲稿
2015/07/30 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
python可视化之颜色映射详解
2021/09/15 Python