json – Django REST框架序列化非常慢

我在 Python 2.7和Django 1.7.1中使用django-restframework
我有一个API,它返回一些从数据库获取的特定值,它使用这样的自定义序列化器:
class InventarioSerializer(serializers.ModelSerializer):
    item = serializers.RelatedField(source='producto.item')
    ubicacion = serializers.RelatedField(source='ubicacion.nombre')
    class Meta:
        model = Inventario
        fields = ('epc','item','cantidad','ubicacion')

我的API视图以这种方式调用

class ItemEnInventarioViewSet(InventarioListModelMixin,viewsets.ModelViewSet):
    serializer_class = InventarioSerializer
    renderer_classes = (UnicodeJSONRenderer,)

我的ListModelMixin是这样的:

class InventarioListModelMixin(object):
    def list(self,request,*args,**kwargs):
        item = request.QUERY_ParaMS.get('item',None)
        inventario = Inventario.objects.filter(producto__item = item)
        if inventario.count() == 0:
            return HttpResponse(u"El item %s no se encuentra en el inventario" % item,status=400)
        self.object_list = inventario
        # Switch between paginated or standard style responses
        page = self.paginate_queryset(self.object_list)
        if page is not None:
            serializer = self.get_pagination_serializer(page)
        else:
            serializer = self.get_serializer(self.object_list,many=True) <<--THIS IS THE PROBLEM
        return Response(serializer.data)

它运行正常,但是当我尝试从数据库获取1000个或更多条目时,序列化器使它非常慢,大约25到35秒.

对DB的查询非常简单,因此DB根本不是问题.

如果我用这个函数序列化查询集“data = serializers.serialize(‘json’,myQuerySet)”它最多需要3秒但我没有得到我想要的信息,这就是我使用自定义序列化器的原因

是否有最快的方法来获得这些数量的价值?也许与另一个Serializer?任何的想法?

**答案谢谢Kevin **
查询更改为:

inventario = Inventario.objects.select_related('producto__item','ubicacion__nombre').filter(producto__item = item)

…使序列化程序不会在每个结果行中命中数据库以检索外部值.

解决方法

The Query to the DB is very simple so the DB is not the problem at all.

确保您的查询没有N+1 issue.它们可能很简单,但如果它们很多,那么它将花费相当多的时间.我在这里写了很多关于fixing performance issues in Django REST Framework文章,你可以通过搜索找到很多关于它的信息.

Is there a fastest way to GET that quantity of values? Maybe with another Serializer? any idea?

如果您的数据不经常更改,或者您可以处理任何可能的缓存问题,那么您可以通过向API添加一些缓存来获益. drf-extensions提供了许多有用的缓存用于缓存,如果您的问题实际上与您的查询无关,则可以帮助您.

when I try to GET form the DB arround 1000 or more entries

我知道你的代码内置了分页,但我想强调在处理大量数据时使用分页的价值.请求中的性能往往是非常线性的,您需要检索的数据越多,检索它的时间就越长.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...