【问题标题】:Django Rest Framework adding 2 numbersDjango Rest Framework 添加 2 个数字
【发布时间】:2015-05-05 20:57:35
【问题描述】:

我是 Django Rest 框架的新手。为了学习,我正在创建一个类 Num

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 为

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')

网址重定向如下:

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)

我的views.py如下:

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)

我正在尝试创建一个名为 AddNum 的函数,它将添加对应于任何 id 的 num1 和 num2。 请帮帮我。

【问题讨论】:

    标签: python django django-models django-rest-framework


    【解决方案1】:

    由于您有一个模型并且想要列出、检索和创建实例,我建议您使用Viewsets。所以,它会是这样的:

    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)
    

    够了,ModelViewSet 类有 list()retrieve()create()update()destroy() 方法,你可以覆盖或不覆盖。

    你的 urls.py 可能是这样的:

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

    并在 /num/{pk}/add_num/ 访问方法 add_num()

    【讨论】:

    • 假设我想为任何对象返回 num1 和 num2 的总和。如何在 Django-rest 中完成
    • 好的,我想我得到了你想要的,这是一个额外的链接。我已经编辑了我的回复。否则,如果您只想要一个返回总和的函数,而不是返回总和的链接,您可以在类中添加一个方法,就像其他任何方法一样:p。
    • 非常感谢@Victor,这很有帮助
    • 我很高兴听到这个消息。您可以将我的答案标记为正确(答案左侧的“勾选”按钮)并点赞。
    猜你喜欢
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    • 2022-11-30
    相关资源
    最近更新 更多