tôi bằng Python 2.7 và Django 1.7.1 với django-restframework Tôi đã một API trả về cho tôi một số giá trị cụ thể được thực hiện fron cơ sở dữ liệu, nó sử dụng một Serializer Tuỳ chỉnh như thế này:Django REST của Khung Serialize cực kỳ chậm
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')
xem API của tôi được gọi theo cách này:
class ItemEnInventarioViewSet(InventarioListModelMixin, viewsets.ModelViewSet):
serializer_class = InventarioSerializer
renderer_classes = (UnicodeJSONRenderer,)
và ListModelMixin của tôi là thế này:
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)
Nó hoạt động tốt, nhưng khi tôi cố gắng để GET hình thành DB arround 1000 hoặc nhiều mục, serializer làm cho nó rất rất chậm, arround 25-35 giây.
Truy vấn đến DB rất đơn giản nên DB không phải là vấn đề gì cả.
Nếu tôi sắp đặt từng queryset với chức năng này "data = serializers.serialize('json', myQuerySet)
" phải mất ít nhất 3 giây nhưng tôi không nhận được các thông tin như tôi muốn, đó là lý do tại sao tôi sử dụng một Tuỳ chỉnh Serializer
Có cách nào nhanh nhất để GET số lượng giá trị đó? Có thể với Serializer khác? bất kỳ ý tưởng?
** ĐÁP Nhờ Kevin ** Thay đổi truy vấn để:
inventario = Inventario.objects.select_related('producto__item','ubicacion__nombre').filter(producto__item = item)
... làm cho Serializer không để đạt các cơ sở dữ liệu mỗi kết quả hàng để lấy các giá trị ngoại.
trông giống như một vấn đề truy vấn ... – Raphael
Truy vấn của tôi rất đơn giản, nó tìm 8 trường với một INNER JOIN và một WHERE, cơ sở dữ liệu trả về dữ liệu trong vòng chưa đến 0,25 giây, vì vậy chắc chắn không phải là truy vấn hoặc db –