zoukankan      html  css  js  c++  java
  • <玩转Django2.0>读书笔记:模板和模型

    1. 模板内置标签

    Django常用内置标签

    标签 描述
    {% for %} 遍历输出变量的内容
    {% if %} 对变量进行条件判断
    {% csrf_token %} 生成csrf_token标签,用于防护跨站请求伪造攻击
    {% url %} 引用路由配置地址,生成相应的URL地址
    {% with %} 将变量名重新命名
    {% load %} 加载导入Django的标签库
    {% static %} 读取静态资源文件
    {% extends xxx %} 模板继承,xxx为模板文件名,使当前模板继承xxx模板
    {% block xxx %} 重写父类模板的代码
    • {% url %}

      相关的路由地址: path('search/<int:page>',search_views,name='search')

      <a href="{% url 'search' 1%}">第一页</a>

      字符串search是URL的参数name的值,1是URL的变量page的值

    for标签模板变量说明

    变量 描述
    forloop.counter 当前循环索引,从1开始计算
    forloop.counter0 当前循环索引,从0开始计算
    forloop.revcounter 索引从最大数开始递减,直到索引到1的位置
    forloop.revcounter0 索引从最大数开始递减,直到索引到0的位置
    forloop.first 当遍历的元素第一项为真
    forloop.last 当遍历的元素最后一项为真
    forloop.parentloop 在嵌套的for循环中,获取上层for循环的forloop

    2. 模板内置过滤器

    参考:

    官方文档

    Django过滤器

    3. 模型字段

    参考:

    官方文档

    django中models field详解

    4. 数据查询

    • 单表查询

      # all 全表查询
      ps = Product.objects.all()    
      
      # 查询前5条
      ps = Product.objects.all()[:5]    
      
      # values 查询某个字段
      ps = Product.objects.values('ttype')
      # distinct 去掉重复的
      ps = ps.distinct()
      
      # values_list 查询多个字段,列表元素以元组格式表示
      ps = Product.objects.values_list('name','price')[:5]
      
      # get 返回一条数据,没有查询到会报错
      p = Product.objects.get(id=3)
      print(p)
      
      # filter 可返回空,返回列表
      ps = Product.objects.filter(ttype="手机")
      
      # SQl的or查询
      from django.db.models import Q
      ps = Product.objects.filter(Q(ttype="手机")|Q(ttype="出行"))
      
      # count 统计数量
      counter = Product.objects.all().count()
      print(counter)
      
      根据价格降序排列 
      默认升序,降序加"-"
      ps = Product.objects.order_by("-price")
      
      from django.db.models import Sum,Count,Avg
      # annotate返回一个列表
      # 分组后进行操作    
      # 数量统计
      ps = Product.objects.values('ttype').annotate(Count('price'))
      # 求和
      ps = Product.objects.values('ttype').annotate(Sum('price'))
      # 求平均数
      ps = Product.objects.values('ttype').annotate(Avg('price'))
      
      from django.db.models import Sum,Count,Avg
      # aggregate返回一个字典
      p =  Product.objects.aggregate(type_count=Count('ttype'))
      p =  Product.objects.aggregate(Sum('id'))
      p =  Product.objects.aggregate(Avg('price')) 
      print(p,type(p))
      
    • 匹配符

      匹配符 说明
      __exact 精确等于
      __iexact 精确等于,忽略大小写
      __contains 模糊匹配
      __icontains 模糊匹配,忽略大小写
      __gt 大于
      __gte 大于等于
      __lt 小于
      __lte 小于等于
      __in 判断是否在列表内
      __startswith 以...开头
      __istartswith 以...开头,忽略大小写
      __endswith 以...结束
      __iendswith 以...结束,忽略大小写
      __range 在...范围内
      __year 日期字段的年份
      __month 日期字段的月份
      __day 日期字段的天数
      __isnull 判断是否为空
    • 多表查询

      t = ProductType.objects.get(id=1)
      # 正向查询
      print(t.typename)
      # 反向查询
      print(t.product_set.values('name'))
      
      # 查询Product的字段name和模型ProductType的字段typename
      ps = Product.objects.select_related('tttype').values('name','tttype__typename')
      
      # 查询两个模型的全部数据
      ps = Product.objects.select_related('tttype').all()
      
      • 以模型Product作为查询对象主体,也可以使用模型ProductType,只要两表之间有外键关联即可

      • 设置select_related的参数值为"tttype",该参数值是Product定义的tttype字段

      • 如果在查询过程中需要使用另一个数据表的字段,可以使用"外键__字段名"来指向该表的字段

  • 相关阅读:
    SpringBoot:第五篇 CommandLineRunner
    多列单个索引和联合索引的区别
    数据库从0到0.1 (一): LSM-Tree VS B-Tree
    SpringBoot:第四篇 集成Guava(本地缓存+分布式缓存)
    SpringBoot:第三篇 配置修改
    TSINGSEE青犀视频编译WebRTC Android版报错The only supported distros are xxxxxxx处理方式
    TSINGSEE青犀视频开发WebRTC视频推流播放平台前端获取视频流列表错误是什么原因?
    如何修改TSINGSEE青犀视频开发的多平台支持视频RTSPServer组件EasyRTSPServer-win的端口号?
    视频RTSPServer组件EasyRTSPServer-win测试视频无法拉取到流在VLC播放如何修复?
    TSINGSEE青犀视频开发EasyWasmPlayer H265播放器是如何实现视频截图功能的?
  • 原文地址:https://www.cnblogs.com/wangbaby/p/10547677.html
Copyright © 2011-2022 走看看