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 %}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值