目录
一、defer 、only 查询优化
only('字段名1','字段名2'):只取我指定的字段
only('id','name'):取的对象,只有id和namedefer('字段名1','字段名2'):只取除了指定字段的内容
defer('id','name'):取出对象,字段除了id和name都有注意:
defer和only的返回值是queryset里套对象,只是对象里只有指定的字段
将取出来的对象.非指定字段,仍然可以查询,但是不建议使用,因为会再次查询数据库,丢失了指定字段查询的意义。
ret=models.Author.objects.only('nid') # 只在查询返回结果加入'nid'字段 for i in ret: # 查询未指定加入的字段,会再次查询数据库,造成数据库压力大 print(i.name)
二、事务 transaction - 原子性操作
from django.db import transaction with transaction.atomic(): sql1(orm的sql语句) sql2
三、choice -- 简化不常变化的字段
注意:
若经常变,使用常用数据库。即,外键操作。
数据输入表1内为数字,使用get字段名display()是将数字字段内容通过表2翻译成相应文字等内容。
可以将 “数字 - 对应内容” 另外存在一个表中,项目内所有简单对应关系,可以通过此表获取对应内容
- 模型层内创建方式
在模型表中定义mychoice=((1,'男'),(2,'女'),(3,'其他'))
在字段上用:dd = models.IntegerField(choices=mychoice)
# 模型层 model内创建数据库操作 class Info(models.Model): id = models.AutoField(primary_key=True) name=models.CharField(max_length=32) age=models.IntegerField() class Author(models.Model): id = models.AutoField(primary_key=True) name=models.CharField(max_length=32) # 可以用ForeignKey,但是得设置唯一性约束,会报警告,不建议用,建议用OneToOneField sex = models.ForeignKey(to='Info',to_field='id',unique=True) sex = models.OneToOneField(to='Info',to_field='id',null=True) # 同上sex mychoice=((1,'男'),(2,'女'),(3,'其他')) sex = models.IntegerField(choices=mychoice) # 表内创建int类型sex字段,与mychoice建立联系
- 视图层 使用方式:对象(单).get_字段名_display() author.get_dd_display()
author = Author.objects.all() print(author) # <QuerySet [<Author: n1>, <Author: n2>]> for a in author: sex = a.get_dd_display() name = a.name print(name,a.dd,sex,) # n1 1 男 # n2 2 女 return render(request, 'index.html')
- 模板层 使用方式:对象(单).get_字段名_display -- author.get_dd_display
# 视图层内 将后台处理的对象传到前台进行模板渲染 def get(self, request): author = Author.objects.all() return render(request, 'index.html', {'author': author})
{# 前台模板渲染取出对应翻译内容 #} {% for a in author %} {{ a.name }} {{ a.dd }} {{ a.get_dd_display }} <hr> {% endfor %}