gpt4 book ai didi

Django rest 框架 ModelSerializer 运行太慢

转载 作者:行者123 更新时间:2023-12-02 09:28:59 28 4
gpt4 key购买 nike

我们想为我们的 django 项目提供一个 api,所以我们使用了 drf(django rest 框架)。我们使用 ModelSerializer,它提供了一个快捷方式,可以让您自动创建一个带有与 Model 字段对应的字段的 Serializer 类。我们的问题是它运行得很慢。换句话说,序列化过程大约需要 40 秒才能检索到响应。

我们如何才能减少这种延迟?
查看

class MyObjViewSet(viewsets.ModelViewSet):

pagination_class = LargeResultsSetPagination

def get_queryset(self):
queryset = MyObj.objects.all().order_by('time')
return queryset

serializer_class = MyObjSerializer

我的对象模型

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')

MyObj 用户模型

class User(models.Model):
id = models.IntegerField(primary_key=True)
username = models.CharField(max_length=80)

我的 Obj 序列化器

class MyObjSerializer(serializers.ModelSerializer):

class Meta:
model = MyObj
fields = ('id', 'type', 'time', 'user')

我的问题是当我想检索我的 obj 列表时,大约需要 40 秒!

最佳答案

其实是drf的真正问​​题。
如果你有很多查询集返回的对象,那么你必须做几个步骤:
1.检查你是否使用many=True,它会产生显着的性能提升。
2. 避免在大型对象集上使用 ModelSerializer。事实上,值得考虑的是避免任何类型的 rest_framework.Serializer
3. 尝试使用serpy 库进行序列化。但不要忘记,它与 rest_framework.Serializer 并不完全兼容。
4. 使用 .values()DictSerializer。它将大大加快序列化速度。
5. 不要忘记数据库中的索引。 6. 使用ForeignKey时使用prefetch_relatedselect_related等强大的东西。
7. 最后一种方法是使用简单的dict。否则,我没有得到明显的结果:只有 10% 与带有 DictSerializerserpy 相比。

当我必须序列化许多对象(大约 3-5k)时,drf 序列化程序的开销至少为 2.5 秒(没有 sql 的时间)。优化后我得到了大约 200-300 毫秒。

我希望,drf 的开发人员会在框架上做一些性能改进。

关于Django rest 框架 ModelSerializer 运行太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35014879/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com