一、事务
当你对两条记录操作,第一条记录成功,但是第二条失败的话,应该把之前的操作无效化,进行回滚。
语法
from django.db import transaction
with transaction.atomic():
#写数据操作,一旦发生异常就回滚到上方
二、模型层补充之choice
class Author(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
#在模型表定义变量choicess
choicess=((1,'男'),(2,'女'),)
sex = models.IntegerField(choices=choicess)
#在视图层get_字段名_display(),1转换为男显示,2转换为女显示
author.get_sex_display()
三、数据库优化之defer和only
#only:取指定的字段,返回值是queryset里套对象,只有指定的字段
#defer:取指定的字段以外的,返回值是queryset里套对象,只有指定以外的字段
#只会获得name字段
models.Author.objects.only('name')
#都是取得所有的,然后只显示name
models.Author.objects.all().value('name') | .filter('name')
#减少对数据库的压力
四、模板层之inclusion_tag
1.先注册app
2.在app下创建一个templatetags的模块
3.在模块下新建一个py文件
my_tags.py
from django.template import Library
register=Library()#名字必须叫register
#使用装饰器:@register.inclusion_tag()
@register.inclusion_tag('result.html')
def show_results(n):
n = 1 if n < 1 else int(n)
data = ["第{}项".format(i) for i in range(1, n+1)]
return {"data": data}
#返回字典
4.模板里就能取到字典,渲染模板
模板:result.html
<ul>
{% for choice in data %}
<li>{{ choice }}</li>
{% endfor %}
</ul>
5.使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>inclusion_tag test</title>
</head>
<body>
<!-- 加载my_tags.py-->
{% load my_tags %}
<!-- 使用,传入参数-->
{% show_results 10 %}
</body>
</html>