简介:今天,首席执行官指出,要与您分享如何优化Djangoomer。如果您可以解决您现在面临的问题,请不要忘记注意此网站。让我们现在开始!
在项目开发中,经常会遇到需求:数据是从旧数据库导入到新数据库中的。例如,从SQL Server导入的新型MY SQL数据库。许多字段,如果您可以使用Django的ORM,它将更加方便。
创建py file import_data.py在manage.py目录中
App.Models
在设置中配置多个数据库。
Sqlalchemy使用两个级别。1是使用SQL表达式。坦率地说,您可以让您在Python中编写SQL。2是它的ORM。ORM使用会话。它可以在多个过程中管理会话和通过会话。操作业务自己。写作是通常的事务脚本(域模型通常称为贫血)。实际上的编码通常与1和1混合。
Django通过中间件的中部隐藏了连接/交易管理的概念,并且写作相对简单。它接近爪哇交通拥堵的交通拥堵。内容中没有SQL表达式级别。
但是,在可用于达到Sqlalchemy高峰的ORM中,它没有以其他语言看到。Ruby具有Sqlalchemy的阴影。
解决django“懒惰”的基本方法
现在,我们解决此问题的方法是“预载”。本质上,您要预先警告django orm,您必须一遍又一遍地告诉它相同的无聊指令。在上面的示例中,很容易添加此句子在DRF开始之前:
querySet = queryset.prefetch_reled('orders')
当DRF调用上述客户的相同序列化时,情况就是这样:
获取所有客户(执行两个回合数据库操作,第一个是获取客户,第二个是获得相关客户的所有相关顺序。)。
对于第一个客户,获取其订单(无需访问数据库,我们在上一步中获得了所需的数据)
对于第二个返回客户,获取订单(无需访问数据库)
对于第三个返回客户,获取订单(无需访问数据库)
对于第四个返回客户,获取订单(无需访问数据库)
对于第五返回客户,获取订单(无需访问数据库)
对于第六返回客户,获取订单(无需访问数据库)
您意识到您可以有很多客户,并且不再需要继续等待数据库。
实际上,在步骤1中请求Django Orm的“准备”,该步骤1可以在本地高速缓存数据中提供步骤2+所需的数据,并具有先前数据库,从本地缓存数据中读取数据基本上是瞬时的,因此我们有当我们有很多客户时,获得了巨大的性能加速。
解决Django REST框架的性能的标准化模式
我们已经确定了一种通用模式,可以优化Django REST框架的性能,也就是说,每当序列化查询嵌套字段时,我们添加了一个新的@StaticMethod,名为Setup_eager_loading,如下:
班级CobuliteRializer(Serializers.ModelSerializer):
orders = orderSerializer(许多= true,read_only = true)
def setup_eager_loading(cls,querySet):
“”“”执行不加载数据。“”“”“”“”“”“”
querySet = queryset.prefetch_reled('orders')
返回QuerySet
这样,无论您在何处使用此序列化,您只需要在调用serialization之前只调用setup_eager_loading,就像这样::
customer_qs = customer.objects.all()
customer_qs = cusiteerializer.setup_eager_loading(customer_qs)#设置急切的加载以避免n+1选择
post_data = cusiteerializer(customer_qs,多个= true).data。
或者,如果您有Apiview或Viewset,则可以在get_queryset方法中调用setup_eager_loading ::
def get_queryset(self):
querySet = cunituter.objects.all()
#设置急切的加载以避免n+1选择
querySet = self.get_serializer_class()。setup_eager_loading(querySet)
返回QuerySet
结论:以上是首席CTO注释为每个人编写的Djangoorm相关内容的摘要。希望它对您有所帮助!如果您解决了问题,请与更多关心此问题的朋友分享?