如何接受表单数据并将其与 Django RESTFramework 中的一些处理结果一起返回



我试图理解Django RESTFramework。我已经熟悉Django了。我想创建一个端点,它接受一些文本数据并对其进行处理,并将其与处理结果(文本形式(一起返回给用户。我已经完成了几个关于该主题的教程,但我仍然不明白它是如何工作的。下面是一个工作教程项目的示例。如何编辑它以实现我的目标?这一切看起来都是自动的。

# views.py
from rest_framework import generics
from .models import Snippet
from .serializers import SnippetSerializer
class SnippetList(generics.ListCreateAPIView):
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer
​
class SnippetDetail(generics.RetrieveUpdateDestroyAPIView):
    # Here I would like to accept form data and process it before returning it along with the 
    # results of the processing.
    queryset = Snippet.objects.all()
    serializer_class = SnippetSerializer

好的,我认为您是 Django rest 的新手,并尝试了解它的流程,以便我可以通过订阅计划的示例来解释它。

首先,在 models.py 文件中创建一个模型

from django.db import models
class SubscriptionPlan(models.Model):
    plan_name = models.CharField(max_length=255)
    monthly_price = models.IntegerField()
    yearly_price = models.IntegerField()

然后在 view.py 文件中创建视图,例如

from rest_framework.views import APIView
class SubscriptionCreateAPIView(APIView):
    serializer_class = SubscriptionSerializer
    def post(self, request):
        serializer = self.serializer_class(data=request.data)
        serializer.is_valid(raise_exception=True)
        serializer.save()
        return Response(
            {'message': 'Subscription plan created successfully.',
                'data': serializer.data},
            status=status.HTTP_201_CREATED
        )

然后定义一个用于验证的序列化程序和字段,我们可以在其中验证哪些字段将包含在请求和响应对象中。serializers.py

from rest_framework import serializers
from .models import SubscriptionPlan

class SubscriptionSerializer(serializers.ModelSerializer):
    plan_name = serializers.CharField(max_length=255)
    monthly_price = serializers.IntegerField(required=True)
    yearly_price = serializers.IntegerField(required=True)
    class Meta:
        model = SubscriptionPlan
        fields = (
            'plan_name', 'monthly_price', 'yearly_price',  
        )

    def create(self, validated_data):
        return SubscriptionPlan.objects.create(**validated_data)

现在在 src/subsciption_module/urls 中添加 url.py


from django.urls import path
from .views import SubscriptionCreateAPIView
app_name = 'subscription_plan'
urlpatterns = [
    path('subscription_plan/', SubscriptionCreateAPIView.as_view()),
]

最后,在主 url 所在的根 urls.py 文件中包含模块 url。它将是包含 settings.py 和 wsgi.py 文件的同一目录。src/urls.py

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/v1/', include('src.subscription_plan.urls',  namespace='subscription_plan')),
]

就是这样。这就是 flow 在 django rest 中的工作方式,你可以通过这种方式处理数据和显示数据。有关更多详细信息,您可以参考 django rest 文档。

但这与你对普通 Django 所做的没有任何不同。您的 SnippetDetail 视图只是一个基于类的视图,与任何基于类的视图一样,如果要执行任何特定操作,则会覆盖相关方法。在您的情况下,您可能希望在收到更新数据的 PUT 请求时重写update()以执行自定义逻辑。

最新更新