<玩转Django2.0>读书笔记:模板和模型
1. 模板内置标签
Django常用内置标签
标签 | 描述 |
---|---|
遍历输出变量的内容 | |
对变量进行条件判断 | |
生成csrf_token标签,用于防护跨站请求伪造攻击 | |
引用路由配置地址,生成相应的URL地址 | |
将变量名重新命名 | |
加载导入Django的标签库 | |
读取静态资源文件 | |
模板继承,xxx为模板文件名,使当前模板继承xxx模板 | |
重写父类模板的代码 |
-
相关的路由地址:
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. 模板内置过滤器
参考:
3. 模型字段
参考:
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字段
-
如果在查询过程中需要使用另一个数据表的字段,可以使用
"外键__字段名"
来指向该表的字段
-