djano一对一,多对多,分页

Posted zrx19960128

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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注入

以上是关于djano一对一,多对多,分页的主要内容,如果未能解决你的问题,请参考以下文章

hibernate 关联关系(多对多对多一对一)的配置

MyBatis一对多,多对一,多对多

多对多、一对多或多对一

关联查询 一对多,多对一,多对多,自关联

数据库表设计(一对多,多对多)

mybatis 一对一 一对多 多对多