Hay*_*emi 3 django performance django-rest-framework
我们想为我们的 django 项目提供一个 api,所以我们使用 drf (django Rest Framework)。我们使用 ModelSerializer,它提供了一种快捷方式,可让您自动创建一个具有与模型字段对应的字段的序列化器类。我们的问题是它运行得很慢。换句话说,序列化过程大约需要 40 秒才能检索到响应。
我们怎样才能减少这种延迟呢?
看法
class MyObjViewSet(viewsets.ModelViewSet):
pagination_class = LargeResultsSetPagination
def get_queryset(self):
queryset = MyObj.objects.all().order_by('time')
return queryset
serializer_class = MyObjSerializer
Run Code Online (Sandbox Code Playgroud)
我的对象模型
class MyObj(models.Model):
id = models.BigIntegerField(primary_key=True)
time = models.DateTimeField()
type = models.CharField(max_length=5)
user = models.ForeignKey('User', related_name='myobj')
Run Code Online (Sandbox Code Playgroud)
MyObj 用户模型
class User(models.Model):
id = models.IntegerField(primary_key=True)
username = models.CharField(max_length=80)
Run Code Online (Sandbox Code Playgroud)
我的 Obj 序列化器
class MyObjSerializer(serializers.ModelSerializer):
class Meta:
model = MyObj
fields = ('id', 'type', 'time', 'user')
Run Code Online (Sandbox Code Playgroud)
我的问题是,当我想检索 obj 列表时,大约需要 40 秒!
事实上,这是drf的一个真正的问题。
如果您有很多由 queryset 返回的对象,那么您必须执行以下步骤:
1. 检查您是否使用many=True,它将产生显着的性能改进。
2.避免ModelSerializer在巨大的物体上。事实上,值得考虑的是避免任何类型的rest_framework.Serializer
3. 尝试使用serpy库进行序列化。但您不应该忘记它并不完全兼容rest_framework.Serializer.
4. 使用.values()和DictSerializer。它会给你带来很大的序列化速度。
5. 不要忘记数据库中的索引。6.在使用 时prefetch_related使用诸如 等强大的东西。
7. 最后一种方法是使用 simple 。否则,我没有得到明显的结果:与. select_relatedForeignKeydictserpyDictSerializer
我遇到过一个情况,当我必须序列化许多对象(大约 3-5k)时,drf 序列化器的开销至少为 2.5 秒(没有 sql 时间)。优化后,我得到了大约 200-300 毫秒。
我希望drf的开发人员能够在框架上做一些性能改进。
| 归档时间: |
|
| 查看次数: |
5057 次 |
| 最近记录: |