django-rest сохранить массив данных в БД - PullRequest
0 голосов
/ 13 мая 2018

Привет, я пытаюсь сохранить данные формы в БД.я предоставил для вас печать requset.data, как вы видите, requirement имеет два элемента.

Я хочу сохранить каждый элемент в базе данных, который я использовал для цикла, чтобы сохранить каждый элемент списка, но цикл будет сохранять каждый символэлемента вроде h-e-l,... в строке таблицы ... где моя ошибка ... спасибо

также печать request.data.get('requirement') вернет второй элемент

это печать request.data всервер:

<QueryDict: {'requirement': ['hello', 'bye'], 'audience': ['adasd'], 'achievement': ['asdasd'], 'section': ['410101010'], 'title': ['asdasd'], 'mini_description': ['asdad'], 'full_description': ['asdasd'], 'video_length': ['10101'], 'video_level': ['P'], 'price': [''], 'free': ['true'], 'image': [<InMemoryUploadedFile: p.gif (image/gif)>]}>

просмотр:

class StoreCreateAPIView(generics.CreateAPIView):
    parser_classes = (MultiPartParser, FormParser)
    permission_classes = [IsAuthenticated]

    def perform_create(self, serializer):
        serializer.save(author=self.request.user)

    def post(self, request, *args, **kwargs):
        if request.method == 'POST':
            print(request.data)
            file_serial = ProductSerializer(data=request.data, context={"request": request})
            if file_serial.is_valid():
                file_serial.save(author_id=request.user.id)
                requirement = request.data['requirement']
                audience = request.data.get('audience')
                achievement = request.data.get('achievement')
                sections = request.data.get('section')

                print(request.data['requirement'])
                pid = file_serial.data.get('product_id')
                for item in requirement :
                    req = ProductRequiredItems(
                        item = item,
                        product_id = pid
                    )
                    req.save()

1 Ответ

0 голосов
/ 13 мая 2018

Прежде всего, переопределение метода CreateAPIView post в вашем коде делает ваш пользовательский метод perform_create бесполезным, если вы явно не вызываете его из своего настроенного метода post.В противном случае он никогда не будет вызван.

также распечатка request.data.get ('требование') вернет второй элемент

Возвращает последний элемент согласноDjango документы для QueryDict.__getitem__(key).

Я хочу сохранить каждый элемент в базе данных, которую я использовал для цикла, чтобы сохранить каждый элемент списка, но цикл будет сохранять каждый символ элемента, какhel, ...

Это из-за вышеуказанной функциональности QueryDict.Когда вы делаете:

requirement = request.data['requirement']
# requirement = request.__getitem__('requirement')

, он вызывает метод QueryDict.__getitem__(key) и, таким образом, возвращает только последний элемент (который является строкой в ​​вашем примере).

Ответ:

Вы можете просто переопределить метод CreateAPIView create и позволить вашему сериализатору обрабатывать все остальное.

# views.py
from django.shortcuts import render
from rest_framework import generics, status
from rest_framework.response import Response
from .models import MyObj
from .serializers import MyObjSerializer

class MyObjView(generics.CreateAPIView):
    serializer_class = MyObjSerializer
    queryset = MyObj.objects.all()

    def create(self, request, *args, **kwargs):
        # The QueryDicts at request.POST and request.GET will be immutable 
        # when accessed in a normal request/response cycle. 
        # To get a mutable version you need to use QueryDict.copy().
        req_data = request.data.copy()
        requirements = req_data.pop('requirement')
        serializers_data = []
        for requirement in requirements:
            req_data ['requirement'] = requirement
            serializer = self.get_serializer(data=req_data)
            serializer.is_valid(raise_exception=True)
            self.perform_create(serializer)
            serializers_data.append(serializer.data)
        return Response(serializers_data, status=status.HTTP_201_CREATED)

# serializers.py
from rest_framework import serializers
from .models import MyObj

class MyObjSerializer(serializers.ModelSerializer):
    class Meta:
        model = MyObj
        fields = '__all__'

Посмотрите на DRF CreateModelMixin.Он определяет методы create & perform_create, которые используются в CreateAPIView при выполнении запроса POST.Я просто немного изменил их для вашего конкретного случая.

Надеюсь, это поможет.

...