Override Viewset POST action to save and update data in Django Rest Framework

Asked

Viewed 280 times

0

I am creating an application for stock control and am having the following difficulty. When I enter a [product input] the input quantity must be added to the stock quantity of [product]. There is the possibility to update [Product] in the create method of [product input]?

serializer de [product]:

from rest_framework.serializers import ModelSerializer
from produto.models import Produto


class ProdutoSerializer(ModelSerializer):
    class Meta:
        model = Produto
        fields = ('id', 'nome', 'descricao', 'categoria', 'quantidade_estoque', 'imagem')

serializer de [product input]:

from rest_framework.serializers import Modelserializer from estoque_entrada.models import Estoqueentrada

class EstoqueEntradaSerializer(ModelSerializer):
    class Meta:
        model = EstoqueEntrada
        fields = ('id', 'produto', 'data', 'quantidade_entrada', 'valor_pago', 'usuario')

viewset of [product input] with what I tried to do:

from rest_framework.viewsets import ModelViewSet
from rest_framework.response import Response
from rest_framework import status
from estoque_entrada.models import EstoqueEntrada
from produto.models import Produto
from produto.api.serializers import ProdutoSerializer
from .serializers import EstoqueEntradaSerializer


class EstoqueEntradaViewSet(ModelViewSet):
    queryset = EstoqueEntrada.objects.all()
    serializer_class = EstoqueEntradaSerializer

    def create(self, request, *args, **kwargs):

        produto_queryset = Produto.objects.filter(id=request.data['produto'])
        quantidade_entrada = int(request.data['quantidade_entrada'])
        quantidade_produto = produto_queryset[0].quantidade_estoque
        quantidade_produto = quantidade_produto + quantidade_entrada
        produto_serializer = ProdutoSerializer(produto_queryset, many=True)
        produto_data = produto_serializer.data
        produto_data[0]['quantidade_estoque'] = quantidade_produto
        # produto_serializer.is_valid(produto_data)
        # produto_serializer.update(produto_data)

        entrada_serializer = self.get_serializer(data=request.data)
        entrada_serializer.is_valid(raise_exception=True)
        self.perform_create(entrada_serializer)
        headers = self.get_success_headers(entrada_serializer.data)
        return Response(entrada_serializer.data, status=status.HTTP_201_CREATED, headers=headers)
  • It seems to me that the problem is that you’re just Serializing, no updating the instance of Produto that you bred.

1 answer

0

The Product class of models was imported, obtained and changed their objects and then used the product.save() to change the database.

from estoque_entrada.models import EstoqueEntrada
from produto.api.serializers import ProdutoSerializer
from produto.api.viewsets import ProdutoViewSet
from produto.models import Produto
from rest_framework import status
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet

from .serializers import EstoqueEntradaSerializer


class EstoqueEntradaViewSet(ModelViewSet):
    queryset = EstoqueEntrada.objects.all()
    serializer_class = EstoqueEntradaSerializer

    def create(self, request, *args, **kwargs):

        produto_queryset = Produto.objects.filter(id=request.data['produto'])
        quantidade_entrada = int(request.data['quantidade_entrada'])
        quantidade_produto = produto_queryset[0].quantidade_estoque
        quantidade_produto = quantidade_produto + quantidade_entrada
        produto_serializer = ProdutoSerializer(produto_queryset, many=True)
        produto_data = produto_serializer.data
        produto_data[0]['quantidade_estoque'] = quantidade_produto
        produto = Produto.objects.get(id=request.data['produto'])
        produto.quantidade_estoque = produto_data[0]['quantidade_estoque']
        produto.save()

        entrada_serializer = self.get_serializer(data=request.data)
        entrada_serializer.is_valid(raise_exception=True)
        self.perform_create(entrada_serializer)
        headers = self.get_success_headers(entrada_serializer.data)
        return Response(entrada_serializer.data, status=status.HTTP_201_CREATED, headers=headers)

Browser other questions tagged

You are not signed in. Login or sign up in order to post.