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

昨日内容:

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注入

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

(0)

相关推荐

  • Bootstrap jquery.twbsPagination.js动态页码分页实例代码

    Bootstrap风格的分页控件自适应的: 参考网址:分页参考文档 1.风格样式: 2.首先引入js文件jQuery.twbsPagination.js <span style="font-size:14px;"><script type="text/javascript" src="plugins/page/jquery.twbsPagination.js"></script></span> 3.

  • Ajax实现无刷新分页实例代码

    今天我们要用ajax做一个分页: 实现Ajax分页: 如果可以的话加上查询条件 找一张表做分页 分页不使用page类 页面不用刷新 Ajax加载数据 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> <script src="jquery-1.11.2.

  • vue+django实现一对一聊天功能的实例代码

    vue+django实现一对一聊天和消息推送的功能.主要是通过websocket,由于Django不支持websocket,所以我使用了django-channels.考虑到存储量的问题,我并没有把聊天信息存入数据库,服务端的作用相当于一个中转站.我只讲述实现功能的结构性代码,具体的实现还请大家看源代码. 前端聊天界面 前端消息提醒界面 后端代码 效果展示 实现过程 后端 首先,我们需要先定义websocket的两条连接路径.ws/chat/xxx/(xxx指代聊天组)这条路径是当聊天双方都进入

  • bootstrap table表格插件之服务器端分页实例代码

    Bootstrap Table是基于Bootstrap的轻量级表格插件,只需要简单的配置就可以实现强大的支持固定表头.单复选.排序.分页.搜索以及自定义表头等功能. 因公司的项目需要实现用户管理的表格实现,所以选用了bootstrap-table用于动态获取后台的用户数据显示到前台. 示例截图: 客户端代码: //引入的css文件 <link href="../public/static/css/bootstrap.min.css" rel="external nofo

  • PHP实现长文章分页实例代码(附源码)

    当文章内容比较长,为了更好的满足用户体验度,我们将文章内容分页显示处理,而一般分页处理是在后台发布文章的时候就将提交的内容生成多个分页后的静态文件.通过本文结合实例采用php动态将长文章内容进行分页处理. 查看效果演示     源码下载 如何分页 手动分页:一般在编辑内容时加入特殊分页标记,如{pages},提交后,PHP程序会根据分页符处理分页,生成不同的静态页面.这种分页方法分页准确,但是需要人工手动添加分页符,工作量大. 自动分页:PHP程序会根据设置好的分页符将内容进行分页,然后生成不同

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

    昨日内容: 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') #忽略大小

  • mybatis 一对一、一对多和多对多查询实例代码

    关键字:association 一对一映射(一个班级只有一个班主任) <select id="getClass" parameterType="int" resultMap="ClassesResultMap"> select * from class c,teacher t where c.teacher_id=t.t_id and c.c_id=#{id} </select> <resultMap type=&q

  • 使用vue和datatables进行表格的服务器端分页实例代码

    想法很简单,用vue生成表格的行,datatables生成分页信息,不想过程曲折,特此记录. datatables端代码: $('#dataTables-example').DataTable({ responsive: true, "serverSide" : true, "ajax": function (data, callback, settings) { postJson( "/AccessControlSystem/user/selectByP

  • 一个典型的PHP分页实例代码分享

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv=&qu

  • jQuery 无刷新分页实例代码

    复制代码 代码如下: <html> <head>     <script type="text/javascript" src="script/jquery-1.7.1.min.js"></script> <script type="text/javascript" src="script/jquery-1.7.1.js"></script>       

随机推荐