Django Rest框架ModelSerializer运行太慢

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 秒!

Rus*_*mov 8

事实上,这是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_relatedForeignKey
dictserpyDictSerializer

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

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