蟒蛇。 Django Rest Framework。如何获得自定义Json响应?

时间:2018-06-18 20:14:55

标签: python json django-rest-framework

我正在尝试在满足条件时(例如ingrediente.saldo< = ingrediente.saldo_minimo)发出消息,告诉用户供应几乎缺货。

你能帮我弄明白怎么做吗?

views.py

class CreateOrderView(generics.ListCreateAPIView):

    """Esta clase maneja los requests GET y POST."""
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

    def perform_create(self, serializer):
        """Guarda la info al crear una nueva ORDEN. RESTA del stock. Controla el saldo mínimo.Devuelve el precio sugerido."""

        serializer.save()
        post = self.request.POST
        lista_productos = json.loads(post.get('productos'))
        precio_hora_trabajada = SystemParameters.objects.get(id=1).precio_hora_trabajada

        serializer.instance.costo_total = costo_total_orden(post)
        serializer.instance.save()


        horas_trabajadas_total = 0
        for prod in lista_productos:
            producto = Product.objects.get(pk=prod['id'])
            Products.objects.create(order=serializer.instance,
                                    product=producto, cantidad=prod['cantidad'])
            for ingred in producto.supplies_set.all():
                cantidad_por_ingrediente = producto.supplies_set.get(supply=ingred.supply_id).cantidad
                ingrediente = ingred.supply
                ingrediente.saldo -= cantidad_por_ingrediente*Decimal(prod['cantidad'])
                ingrediente.save()


                if ingrediente.saldo <= ingrediente.saldo_minimo:
                    alerta= 'Alerta: el supply llegó al stock mínimo'
                    content = {'alerta': alerta}
                    return Response(content)
                continue

            horas_trabajadas_total += producto.horas_trabajadas

        serializer.instance.precio_sugerido = (serializer.instance.costo_total*3)+(precio_hora_trabajada*horas_trabajadas_total)
        serializer.instance.save()

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您需要发送自定义回复,则应覆盖create而不是perform_create。请尝试以下操作:

class CreateOrderView(generics.ListCreateAPIView):
    """
    Esta clase maneja los requests GET y POST.
    """
    queryset = Order.objects.all()
    serializer_class = OrderSerializer

    def create(self, request, *args, **kwargs):
        """
        Guarda la info al crear una nueva ORDEN. RESTA del stock.
        Controla el saldo mínimo.Devuelve el precio sugerido.
        """
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()

        # Your code-snippet starts from here
        post = self.request.POST
        lista_productos = json.loads(post.get('productos'))
        precio_hora_trabajada = SystemParameters.objects.get(id=1).precio_hora_trabajada

        serializer.instance.costo_total = costo_total_orden(post)
        serializer.instance.save()

        horas_trabajadas_total = 0
        for prod in lista_productos:
            producto = Product.objects.get(pk=prod['id'])
            Products.objects.create(order=serializer.instance,
                                    product=producto, cantidad=prod['cantidad'])
            for ingred in producto.supplies_set.all():
                cantidad_por_ingrediente = producto.supplies_set.get(supply=ingred.supply_id).cantidad
                ingrediente = ingred.supply
                ingrediente.saldo -= cantidad_por_ingrediente * Decimal(prod['cantidad'])
                ingrediente.save()

                if ingrediente.saldo <= ingrediente.saldo_minimo:
                    alerta = 'Alerta: el supply llegó al stock mínimo'
                    content = {'alerta': alerta}
                    return Response(content)
                continue

            horas_trabajadas_total += producto.horas_trabajadas

        serializer.instance.precio_sugerido = (serializer.instance.costo_total * 3) + (
                    precio_hora_trabajada * horas_trabajadas_total)
        serializer.instance.save()
        # Your code-snippet Ended here

        headers = self.get_success_headers(serializer.data)
        return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)

请参见ListCreateAPIView的代码库。