How do we POST data in django rest framework using function based views?

Viewed 5315

I am new to django rest framework (DRF) and I need to POST some data using function based views (FDV). I successfully used GET method using this way but have no idea how to use POST method to add values to database.

# app/models.py

class Item(models.Model):
    name = models.CharField(max_length=50)
    quantity = models.IntegerField()
    price = models.FloatField()


# app/urls.py

urlpatterns = [
path('', views.get_data_list, name='list'),
path('post_val/', views.post_data, name='post_val'), # need to implement
]

# app/serializers.py

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = ('id', 'name', 'quantity','price')



# app/views.py

from django.http.response import JsonResponse
from rest_framework.parsers import JSONParser 
 
from .models import Item
from .serializers import ItemSerializer
from rest_framework.decorators import api_view

@api_view(['GET',])
def get_data_list(request):
    if request.method == 'GET':
        items = Item.objects.all()
    items_serializer = ItemSerializer(items, many=True)
    return JsonResponse(items_serializer.data, safe=False)

@api_view(['POST',])
def post_data(request):
    #TO DO

If I want to add this new data like this one {name:"Television", quantity:15, price:999.99} to Item table using POST method, How do we do it in FDV?

2 Answers

Try this

@api_view(['POST',])
def post_data(request):
    serializer = ItemSerializer(data=request.data)
    serializer.is_valid(raise_exception=True)
    serializer.save()
    return Response(serializer.data)

On a side note, you can use DRF's Response object for returning the response. It will automatically convert to JSON or XML based on your config. Import it via

from rest_framework.response import Response

django-rest-framework puts the posted data in request.data

So in short you can retrieve your data from there and create your object:

@api_view(['POST',])
def post_data(request):
    item_serializer = ItemSerializer(data=request.data)
    if item_serializer.is_valid():
        item = item_serializer.save()
    
Related