【问题标题】:Post Request Django REST Framework发布请求 Django REST 框架
【发布时间】:2015-06-18 00:52:59
【问题描述】:

这是我的观点.py

from rest_framework import generics, permissions
from .models import Survey,Response
from .serialize import SurveySerializer,ResponseSerializer,SurveySerializerQuestion
from rest_framework.decorators import api_view

class SurveyList(generics.ListAPIView):
    model = Survey
    serializer_class = SurveySerializerQuestion

    def get_queryset(self):

        return Survey.objects.all()


class SurveyListByID(generics.ListAPIView):
    model = Survey
    serializer_class = SurveySerializer

    def get_queryset(self):
        survey_id = self.kwargs['survey_id']
        return Survey.objects.filter(survey_id = survey_id)


class ResponseList(generics.ListAPIView):

    model = Response
    serializer_class = ResponseSerializer

    def get_queryset(self):
        survey_id = self.kwargs['survey_id']
        return Response.objects.filter(survey_id = survey_id)

这是我的 urls.py

from django.conf.urls import patterns, include, url
from views import SurveyList,SurveyListByID,ResponseList
urlpatterns = patterns('',
url(r'^surveys/$', SurveyList.as_view(),name ='survey-list') ,
url(r'^surveys/(?P<survey_id>[0-9]+)/$', SurveyListByID.as_view(),name ='survey-list-by-id'), 
url(r'^response/(?P<survey_id>[0-9]+)/$', ResponseList.as_view(),name ='response-list'), 
)

这是serialize.py

from rest_framework import serializers
from .models import Employee,Survey,EmployeeSurvey,Response

class SurveySerializer(serializers.ModelSerializer):

    class Meta:
        model = Survey
        fields = ('survey_id', 'question', 'choice1','choice2')


class SurveySerializerQuestion(serializers.ModelSerializer):

    class Meta:
        model = Survey
        fields = ('survey_id', 'question')

class ResponseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Response
        fields = ('id','survey_id','choice1_count','choice2_count')

最后是models.py

import re
from django.db import models
from django.core.validators import RegexValidator
from django.core.exceptions import ValidationError

def alphanumeric_test(val):
    if not re.match('^[0-9a-zA-Z]*$', val):
        raise ValidationError('Only alphanumeric characters are allowed.')

def alphabetic_test(val):
    if not re.match('^[a-zA-Z]*$', val):
        raise ValidationError('Please enter alphabetic value.')

class Survey(models.Model):
    survey_id = models.AutoField(primary_key=True)
    question = models.CharField(max_length = 300)
    choice1 = models.CharField(max_length = 100)
    choice2 = models.CharField(max_length = 100)
    def __unicode__(self):              
        return u'%s %s %s' % (self.question,self.choice1,self.choice2)


class Response(models.Model):
        survey_id = models.ForeignKey(Survey, blank=True, null=True, on_delete=models.SET_NULL)
        choice1_count = models.IntegerField()
        choice2_count = models.IntegerField()
        def __unicode__(self):              
    return u'%s %s %s' % (self.survey_id,self.choice1_count,self.choice2_count)

现在如何在没有 UI 的情况下使用 Django Rest 浏览器在 Django Rest 中编写 POST 请求。 我想做一个 POST 请求,以使用我为 get 所做的 url 捕获调查中的选择。这可能吗?

【问题讨论】:

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


    【解决方案1】:

    在 views.py 中添加一个新类,如下所示:

    class SurveyAPIView(APIView):
    
        def post(self, request, format=None):
            serializer = SurveySerializer(request.data)
            if serializer.is_valid():
                instance = serializer.save()
                return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

    并在 urls.py 中添加一个新行,如:

    url(r'^create-survey/$', SurveyAPIView.as_view(),name ='create-survey') ,
    

    【讨论】:

    • 谢谢!但是如何只记录 url 中的选择呢?例如,你快乐吗?是或否。我只想捕获是或否,并增加与survey_id匹配的响应表列中的计数
    • 'choice1' 可能是 'Yes' 而 'choice2' 可能是 'No' 的想法,然后响应表中的计数将是 Yes 响应的计数(存储在 Response.choice1_count 中)和无响应计数(存储在choice2_count 中)?在上面的示例中验证了序列化程序之后,您可以获得序列化程序.data['choice1'] 和 serializer.data['choice2'] 的响应值。
    • 选择可以是任何东西。例如,您喜欢哪种饮料?茶咖啡
    • 好的。那么通过 serializer.data['choice1'] (等等)访问选择响应是您要在响应表中记录选择的内容吗?
    猜你喜欢
    • 2018-07-31
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 2013-11-07
    • 1970-01-01
    • 2020-10-05
    • 2021-12-09
    相关资源
    最近更新 更多