我在使用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秒,但我无法按照所需格式获得信息,这就是我使用自定义序列化程序的原因。
是否有更快的方法来获取那么多值?也许使用另一个序列化程序?有任何想法吗?
**感谢Kevin的回答**将查询更改为:
inventario = Inventario.objects.select_related('producto__item','ubicacion__nombre').filter(producto__item = item)
这使得序列化器不必在每个结果行中命中数据库以检索外部值。