Sono in Python 2.7 e 1.7.1 con Django Django-restframework Ho un'API che mi restituisce alcuni valori specifici presi fron il database, si utilizza un serializzatore personalizzato come questo:Django REST quadro Serialize estremamente lento
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')
vista del mio API viene chiamata in questo modo:
class ItemEnInventarioViewSet(InventarioListModelMixin, viewsets.ModelViewSet):
serializer_class = InventarioSerializer
renderer_classes = (UnicodeJSONRenderer,)
e la mia ListModelMixin è questa:
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)
Funziona bene, ma quando provo a OTTENERE il DB attorno a 1000 o più voci, il serializzatore lo rende molto molto lento, intorno a da 25 a 35 secondi.
La query sul DB è molto semplice, quindi il DB non rappresenta affatto il problema.
Se ho serializzare il set di query con questa funzione "data = serializers.serialize('json', myQuerySet)
" ci vogliono al massimo 3 secondi, ma io non ottenere le informazioni come voglio, è per questo che io uso un serializzatore personalizzato
Esiste un modo più veloce per ottenere quella quantità di valori? Forse con un altro serializzatore? qualche idea?
** RISPOSTA Grazie a Kevin ** Modifica della query:
inventario = Inventario.objects.select_related('producto__item','ubicacion__nombre').filter(producto__item = item)
... rende il serializzatore non colpire il database di ogni risultato fila per recuperare i valori esteri.
sembra un problema di query ... – Raphael
La mia query è molto semplice, cerca 8 campi con un JOIN INTERNO e uno WHERE, il database restituisce i dati in meno di 0,25 secondi, quindi non è sicuramente la query o il db –