zoukankan      html  css  js  c++  java
  • djano一对一,多对多,分页

    昨日内容:

    1. 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
      拿到某一列的值,但是只能进行数组操作

         
         
    1. XSS -跨脚本(js)攻击

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

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

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

    今日内容:

    1. 一对一

      母表: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.关联的字段名.母表字段名
    2. 多对多

      相亲模型
      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
      区别:
      第一种方式比较灵活
      第二种方式比较死板但是如果将来业务扩展的时候,就需要重新打破重来
      因此推荐使用第一种,自定义创建第三张表


    3. 表中数据类型

      -mysql

      -django admin

       mysqldjango
      数字 tinyint 不存在
        smallint SmallInterField
        mediumint 不存在
        int integerFieled/PositiveIntegerField
        bignt BigInterField/PositiveBigIntegerField
        decimal DecimalField
        float FloatField
        double 不存在
     mysqldjango
    字符串 char 不存在
      varchar CharField
      text TextField
    时间日期 date DateField
      datetime DatetimeField
         

    参数:

    null 数据库中字符段是否为空

    db_column:数据库中字段的列名

    default:数据库中字段的默认值

    primary_key:字段是否为主键

    unique_together :联合唯一索引

    index_together:联合索引

    db_index:数据库中字段是否可以建立索引

    unique:数据库中字段是否可以建立唯一索引

     

    1. 分页

      -内置分页

      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'>&laquo;</span></a></li>"
             else:
                 astr = "<li><a href='/custom/?cur_page=%s' aria-label='Previous'><span aria-hidden='true'>&laquo;</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'>&raquo;</span></a></li>"
             else:
                 astr = "<li><a href='/custom/?cur_page=%s' aria-label='Next'><span aria-hidden='true'>&raquo;</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})

    2. 安全攻击

      -XSS

      -csrf

      -sql注入

  • 相关阅读:
    四个通用分页存储过程(来源于www.codeproject.com)
    C#2.0 print winform 打印窗体数据试试
    C# 2.0 Graphics 画雪人
    [转]Asp.Net 上传大文件专题(1)概述:上传大文件的难点
    [转]Asp.Net 上传大文件专题(2)页面生成流程
    [转]C# 调用sql 2000存储过程
    [转]Asp.Net 上传大文件专题
    [转]Asp.Net 上传大文件专题(3)从请求流中获取数据并保存为文件[下]
    c#中调用Ffmpeg转换视频格式的问题
    [转]Asp.Net 上传大文件专题(3)从请求流中获取数据并保存为文件[上]
  • 原文地址:https://www.cnblogs.com/zrx19960128/p/11361105.html
Copyright © 2011-2022 走看看