Akash Srivastava
Akash Srivastava

Reputation: 292

Django Rest Framework adding 2 numbers

I am new to Django Rest framework.For learning I am creating a class Num as

from django.db import models
from pygments.lexers import get_all_lexers
from pygments.styles import get_all_styles

LEXERS = [item for item in get_all_lexers() if item[1]]
LANGUAGE_CHOICES = sorted([(item[1][0], item[0]) for item in LEXERS])
STYLE_CHOICES = sorted((item, item) for item in get_all_styles())


class Num(models.Model):
 num1=models.IntegerField(default=-1)
 num2=models.IntegerField(default=-1)
 created = models.DateTimeField(auto_now_add=True)

class Meta:
    ordering=('created',)

serializers.py as

from django.forms import widgets
from rest_framework import serializers
from num.models import Num, LANGUAGE_CHOICES, STYLE_CHOICES


class NumSerializer(serializers.ModelSerializer):
  class Meta:
    model = Num
    fields = ('id','num1', 'num2', 'created')

Url redirection is as follows:

from django.conf.urls import patterns, url
from rest_framework.urlpatterns import format_suffix_patterns
from num import views

urlpatterns = [
url(r'^num/$', views.NumList.as_view()),
url(r'^num/(?P<pk>[0-9]+)$', views.NumDetails.as_view()),
url(r'^num/(?P<id>[0-9]+)/add/$',  views.AddNum.as_view(),name='AddNum'),]

urlpatterns = format_suffix_patterns(urlpatterns)

My views.py is as follows:

from django.http import Http404
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from num.models import Num
from num.serializers import NumSerializer
from rest_framework import generics



class NumList(generics.ListCreateAPIView):
  #queryset=Num.objects.all()
 queryset=Num.objects.all()
 serializer_class=NumSerializer

class NumDetails(generics.RetrieveUpdateDestroyAPIView):
"""
Retrieve, update or delete a snippet instance.
"""
 queryset=Num.objects.all()
 serializer_class=NumSerializer

class AddNum(generics.ListAPIView):
 model=Num
 serializer_class=NumSerializer
 def get_queryset(self):
    #queryset=super(AddNum,self).get_queryset()
    n= Num.objects.filter(id=self.kwargs.get('id'))
    content={'data':n['num1']+n['num2']}
    return Response(content)

I am trying to create a function named AddNum which will add num1 and num2 corresponding to any id. Please help me in this.

Upvotes: 1

Views: 1778

Answers (1)

Victor Carri&#231;o
Victor Carri&#231;o

Reputation: 46

Since you have a model and you want to list, retrieve and create instances, I would recommend you to use Viewsets. So, it would be sth like:

from rest_framework import viewsets
from rest_framework.decorators import detail_route


class NumViewSet(viewsets.ModelViewSet):
    queryset = Num.objects.all()
    serializer_class = NumSerializer

    # This method will return the sum of num1 and num2
    @detail_route(methods=['get'], permission_classes=[])
    def add_num(self, request, pk=None):
        num = Num.objects.get(pk=pk)
        sum = num.num1 + num.num2
        return HttpResponse(content=sum, status=200)

It's enough, the class ModelViewSet have list(), retrieve(), create(), update() and destroy() methods that you can override or not.

Your urls.py could be sth like:

from rest_framework import routers

router = routers.SimpleRouter()
router.register(r'num', NumViewSet)
urlpatterns = router.urls

And access the the method add_num() at /num/{pk}/add_num/.

Upvotes: 2

Related Questions