Как принять данные формы и вернуть их вместе с результатами некоторой обработки в Django RESTFramework? - PullRequest
0 голосов
/ 17 июня 2019

Я пытаюсь понять Django RESTFramework.Я уже знаком с Джанго.Я хочу создать конечную точку, которая принимает некоторые текстовые данные, обрабатывает их и возвращает их пользователю вместе с результатами обработки (в тексте).Я закончил пару уроков по этой теме, но до сих пор не понимаю, как это работает.Вот пример из рабочего учебного проекта.Как я могу отредактировать это, чтобы достигнуть моей цели?Все выглядит автоматически.

# 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

Ответы [ 2 ]

1 голос
/ 17 июня 2019

Хорошо, я думаю, что вы новичок в 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)

Теперь добавьте URL-адреса в src / subsciption_module / urls.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')),

]

Вот и все.Вот как работает поток в django rest, и вы можете обрабатывать данные и отображать данные таким образом.Для более подробной информации вы можете обратиться к django rest docs.

0 голосов
/ 17 июня 2019

Но это ничем не отличается от того, что вы делаете с простым Django.Ваше представление SnippetDetail является просто представлением на основе классов, и, как и любое представление на основе классов, если вы хотите сделать что-то конкретное, вы переопределяете соответствующий метод.В вашем случае вы, вероятно, захотите переопределить update() для выполнения своей пользовательской логики при получении запроса PUT на обновление данных.

...