Search code examples
pythondjangodjango-rest-frameworkdjango-rest-viewsets

Return id of new Item created with POST using ModelSerializer and ModelViewSet in Django Rest Framework


I'd like to get the new id as a response after making a Post in Django Rest Framework.

Intended function: User gets a json response with the hyperlink to the new item created.

POST

{
    "label": "BMW M3",
    "price": 5000.00
}

Response:

 {
        "id-url": "www.website.com/api/products/id/"
    }

I am aware this topic been covered in various ways but I am looking for a minimal (but complete) example using a ModelSerializer, I have not be able to find this yet, thus my question.

My model:

class Product(models.Model):
    label = models.CharField(max_length=50, blank=True, null=True)
    price = models.FloatField(blank=True, null=True)

My serializer:

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

My view:

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

My urls:

router = routers.DefaultRouter()
router.register('products', ProductViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

Attempts:

Some references I have attempted. Here is similar question but the answers does seems incomplete ex_0 I can re-create this ex_1, but does not give me the id


Solution

  • Thanks to this post: Get the id of the object recently created Django Rest Framework I managed to come up with a potential solution. It seems to work but I am a bit unsure if it is the "best" way or not.

    class ProductViewSet(viewsets.ModelViewSet):
        queryset = Product.objects.all()
        serializer_class = ProductSerializer
    
        def create(self, request):
            serializer = ProductSerializer(data=request.data)
            if serializer.is_valid():
                product = serializer.save()
                pid = product.id
                product.url = f'http://localhost:8000/api/products/{pid}/'
                data = serializer.data
                data.update({'id-url':product.url}) # attaching key-value to the dictionary
                return Response(data, status=status.HTTP_201_CREATED)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)