【发布时间】:2015-01-12 04:23:51
【问题描述】:
我在 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 秒。
对数据库的查询非常简单,所以数据库根本不是问题。
如果我用这个函数“data = serializers.serialize('json', myQuerySet)”序列化查询集,最多需要 3 秒,但我没有得到我想要的信息,这就是我使用自定义序列化程序的原因
有没有最快的方法来获取这么多值?也许与另一个序列化器?有什么想法吗?
**回答感谢凯文** 将查询更改为:
inventario = Inventario.objects.select_related('producto__item','ubicacion__nombre').filter(producto__item = item)
...使序列化程序不会在每个结果行都访问数据库来检索外部值。
【问题讨论】:
-
看起来像一个查询问题...
-
我的查询非常非常简单,查找8个字段,1个INNER JOIN和1个WHERE,数据库不到0.25秒就返回数据,所以肯定不是query或者db
标签: json django serialization django-rest-framework django-queryset