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 返回汉字的汉语拼音
Feb 27 Python
Python中让MySQL查询结果返回字典类型的方法
Aug 22 Python
Python的__builtin__模块中的一些要点知识
May 02 Python
在Django的视图中使用数据库查询的方法
Jul 16 Python
python 将md5转为16字节的方法
May 29 Python
Python数据类型之Number数字操作实例详解
May 08 Python
python爬虫之爬取百度音乐的实现方法
Aug 24 Python
python requests抓取one推送文字和图片代码实例
Nov 04 Python
python 读取数据库并绘图的实例
Dec 03 Python
Python列表解析操作实例总结
Feb 26 Python
Django接收照片储存文件的实例代码
Mar 07 Python
PYQT5 vscode联合操作qtdesigner的方法
Mar 24 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日期处理函数 整型日期格式
2011/01/12 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
destoon二次开发常用数据库操作
2014/06/21 PHP
destoon实现首页显示供应、企业、资讯条数的方法
2014/07/15 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
讲两件事:1.this指针的用法小探. 2.ie的attachEvent和firefox的addEventListener在事件处理上的区别
2007/04/12 Javascript
javascript入门·动态的时钟,显示完整的一些方法,新年倒计时
2007/10/01 Javascript
Jquery Ajax请求代码(2)
2011/01/07 Javascript
JavaScript 代码压缩工具小结
2012/02/27 Javascript
javascript日期格式化示例分享
2014/03/05 Javascript
JavaScript使用Math.Min返回两个数中较小数的方法
2015/04/06 Javascript
浅谈javascript事件取消和阻止冒泡
2015/05/26 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
js实现滚动条滚动到某个位置便自动定位某个tr
2021/01/20 Javascript
原生js实现水平方向无缝滚动
2017/01/10 Javascript
webpack入门+react环境配置
2017/02/08 Javascript
详解jquery插件jquery.viewport.js学习使用方法
2017/09/08 jQuery
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
详解vue中axios的封装
2018/07/18 Javascript
layui监听select变化,以及设置radio选中的方法
2019/09/24 Javascript
python 图片验证码代码分享
2012/07/04 Python
Python显示进度条的方法
2014/09/20 Python
简单说明Python中的装饰器的用法
2015/04/24 Python
Python中创建字典的几种方法总结(推荐)
2017/04/27 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
tensorflow 保存模型和取出中间权重例子
2020/01/24 Python
python判断两个序列的成员是否一样的实例代码
2020/03/01 Python
玩具反斗城美国官网:Toys"R"Us
2016/09/17 全球购物
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
生物科学专业个人求职信范文
2013/12/07 职场文书
党员干部反四风民主生活会对照检查材料思想汇报
2014/10/12 职场文书
领导欢迎词范文
2015/01/26 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
2016七夕情人节感言
2015/12/09 职场文书
mongodb数据库迁移变更的解决方案
2021/09/04 MongoDB
无线电通信名词解释
2022/02/18 无线电