ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Django orm的优化

2020-11-10 20:32:49  阅读:175  来源: 互联网

标签:缓存 QuerySet 外键 查询 orm books 使用 Django 优化


一、orm优化

  • 1.数据库技术进行优化,包括给字段加索引,设置唯一性约束等等;
  • 2.查询过滤工作在数据库语句中做,不要放在代码中完成(看情况);
  • 3.如果要一次查询出集合的数量,使用count函数,而不是len函数,但是如果后面还需要到集合,那就用len,因为count还需要进行一次数据库的操作;
  • 4.避免过多的使用count和exists函数;
  • 5.如果需要查询对象的外键,则使用外键字段而不是使用关联的外键的对象的主键;

例子:

a.b_id # 正确
a.b.id  # 错误
12
  • 6.在通过all语句查询时,不要做跨表查询,只查询当前表中有的数据,否则查询语句的性能会下降很多;
    比如:
a表存在外键b表
a.b.all() # 错误
12
  • 7.如果想要查询其他表的数据,则加上select_related(ForeignKey字段名,其实就是主动联表查询,性能也会下降),如果有多个,则在括号中加上;
  • 8.加only参数是从查询结果中只取某个字段,而另外一个defer方法则是从查询结果中排除某个字段;
  • 9.不要获取你不需要的东西,可以通过values和value_list实现;
values返回的是字典数组,比如:[{'key1': value1, 'key2': value2}, {'key1': value3, 'key2': value4}]
value_list返回的是tuple数组 [('value1', 'value2'), ('value3', 'value4')]
value_list+flat=True返回的是数组 ['value1', ...]
123
  • 10.如果想知道是否存在至少一个结果,使用exists,而不是使用if QuerySet;但是如果后面需要用到前面的QuerySet,那就可以使用if 判断;
#  Don't waste a query if you are using the queryset
books = Book.objects.filter(..)
if len(books) > 5:
  do_stuff_with_books(books)
#  If you aren't using the queryset use count
books = Book.objects.filter(..)
if books.count() > 5:
  do_some_stuff()
#  But never
if len(Book.objects.filter(..)) > 5:
  do_some_stuff()
1234567891011
  • 11.在任何位置使用QuerySet.exists()或者QuerySet.count()都会导致额外的查询;
  • 12.不要做无所谓的排序,排序并非没有代价,每个排序的字段都是数据库必须执行的操作;
  • 13.如果要插入多条数据,则使用bulk_create来批量插入,减少sql查询的数量;
  • 14.对于缓存的QuerySet对象使用with标签,可以让数据被缓存起来使用;
  • 15.使用QuerySet.extra明确的指出要查询的字段;
  • 16.批量的更新和删除则使用Queryset.update和delete函数,但是更新操作注意对象的缓存;
  • 17.使用QuerySet.Iterator迭代大数据;
当你获得一个queryset的时候,django会缓存下来,保存在内存中,
如果需要对queryset进行多次的循环,那么这种缓存无可厚非; 
但是如果你只需要进行一次的循环,那么其实并不需要缓存,这个使用就可以使用iterator;

比如:
for book in Books.objects.all().iterator():
    do_stuff(book)
1234567
  • 18.如果想判断是否存在外键,只需要判断外键的id即可;
  • 19.不要在循环中查询,而是提前取出,并且做好映射关系,这样在循环中直接通过字典的形式获取到;
  • 20.当计算出一个QuerySet的时候,如果还需要进行多次循环的话,则可以先保留着这个缓存,但是如果只是使用一次的话,没有必要使用到缓存

标签:缓存,QuerySet,外键,查询,orm,books,使用,Django,优化
来源: https://www.cnblogs.com/babyfyy/p/13955833.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有