@Durilka96

Как принять body из POST запроса и вернуть данные на front?

из front делаю axios запрос такого вида:
const response = await axios.post(`http://127.0.0.1:8000/api/catalog-size-disk/`, body, config);

в body лежат вот такие данные: {"newChecked":[2,3,9]}
Каким образом мне нужно принять это на стороне Django? через отдельный serializer или сразу во View
где-то здесь распарсить запрос и вернуть от model нужные данные?
class SizeDiskSet(viewsets.ReadOnlyModelViewSet):

    queryset = SizeDisk.objects.all()
    serializer_class = SizeDiskSerializer
    permission_classes = [permissions.AllowAny]

    def get_serializer_class(self):
        return SizeDiskSerializer


или я вообще не правильно запрос формирую и отправляю?
  • Вопрос задан
  • 474 просмотра
Пригласить эксперта
Ответы на вопрос 1
@serhiops
Python/JavaScript/C++
Достаточно странное прописание api...
class SizeDiskSet(viewsets.ReadOnlyModelViewSet):

    queryset = SizeDisk.objects.all()
    serializer_class = SizeDiskSerializer
    permission_classes = [permissions.AllowAny]

    def get_serializer_class(self):
        return SizeDiskSerializer

1.Вы прописали явно класс сериалайзера в атрибутах класса, зачем вы пишете функцию get_serializer_class?
2. Вы прописуете модификатор доступа permissions.AllowAny, но это поведение по-умолчанию, явно его указывать не нужно(если вы ,конечно, не изменяли значение по умолчанию в settings.py)
3.Вас не смущает, что вы используете viewsets.ReadOnlyModelViewSet для добавления в базу данных? Разве название не говорит само за себя?

serializers.py:
from rest_framework import serializers
from .models import YourModel

class YourModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = YourModel
        fields = "__all__"  #Выберет все поля, но рекомендуется указываять явно при помощи списка или кортежа:['field1', 'field2']

api.py:
from rest_framework.viewsets import ModelViewSet
from .serializers import YourModelSerializer
from .models import YourModel

class YourModelViewset(ModelViewSet):
    queryset = YourModel.objects.all()
    serializer_class = YourModelSerializer

urls.py
from django.urls import path, include
from . import api
from rest_framework import routers

router = routers.SimpleRouter()
router.register(r'model-list', api.YourModelViewset)

urlpatterns = [
    ...
   path('api/v1', include(router.urls)),
]

Теперь список всех записей будет доступен по ссылке api/v1/model-list/
По этой же ссылке вы можете делать POST И GET запросы.
По адресу api/v1/model-list/pk/ Вы получите 1 запись по первичному ключу
По этой ссылке вы сможете делать GET, PUT, PATCH и DELETE запросы (мб еще какие-то но я другие не использовал).
После того, как вы все это проделаете можно будет приступить к выполнению задачи. Первое что пришло мне на ум - переопределить метод create, Метод прописан в миксине CreateModelMixin и состоит в классе ModelViewSet:

from rest_framework.response import Response

class YourModelViewset(ModelViewset):
   #то, что мы рантше писали
   def create(self, request, *args, **kwargs):
        serializer =  YourModelSerializer(data = request.data)
        serializer.is_valid(raise_exception = True)
        serializer.save()
        return Response({"data":serializer.data})

После этого вам вернутся только что сохраненные данные
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы