DAY80-Django框架(十)

一、事务

​ 当你对两条记录操作,第一条记录成功,但是第二条失败的话,应该把之前的操作无效化,进行回滚。

语法

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>
posted @ 2018-11-16 20:42  藏岚  阅读(91)  评论(0编辑  收藏  举报