Django - ORM 数据库优化

目录

一、defer 、only 查询优化

二、事务 transaction - 原子性操作

三、choice -- 简化不常变化的字段

- 模型层内创建方式

- 视图层 使用方式:对象(单).get_字段名_display() author.get_dd_display()

- 模板层 使用方式:对象(单).get_字段名_display --  author.get_dd_display


一、defer 、only 查询优化

  • only('字段名1','字段名2'):只取我指定的字段
    only('id','name'):取的对象,只有id和name

  • defer('字段名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翻译成相应文字等内容。

  • 可以将 “数字 - 对应内容” 另外存在一个表中,项目内所有简单对应关系,可以通过此表获取对应内容

- 模型层内创建方式

  1. 在模型表中定义mychoice=((1,'男'),(2,'女'),(3,'其他'))

  2. 在字段上用: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 %}

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/84250951