django rest将数据数组保存到数据库

django rest将数据数组保存到数据库,django,django-rest-framework,Django,Django Rest Framework,嗨,我正在尝试将表单数据保存到数据库中。 我为您提供了需求的打印。数据,如您所见需求有两项 我想在数据库中保存我用于循环的每个项目,以保存列表的每个项目,但循环将保存项目的每个字符,如表行中的h-e-l,…。。。 我的错在哪里。。。谢谢 另外,request.data.get('requirement')的打印将重新运行第二项 这是服务器中请求数据的打印: <QueryDict: {'requirement': ['hello', 'bye'], 'audience': ['adasd']

嗨,我正在尝试将表单数据保存到数据库中。 我为您提供了
需求的打印。数据
,如您所见
需求
有两项

我想在数据库中保存我用于循环的每个项目,以保存列表的每个项目,但循环将保存项目的每个字符,如表行中的
h-e-l,…
。。。 我的错在哪里。。。谢谢

另外,
request.data.get('requirement')
的打印将重新运行第二项

这是服务器中请求数据的打印:

<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)>]}>

首先,在代码中重写
createapieview
post
方法会使自定义
执行\u create
方法无效,除非您在自定义
post
方法中显式调用它。否则它将永远不会被调用

另外,request.data.get('requirement')的打印将重新运行第二项

根据Django docs for返回最后一项

我想保存我用于循环的数据库中的每个项目,以保存列表中的每个项目,但循环将保存项目的每个字符,如h-e-l

这是因为
QueryDict
的上述功能。当您这样做时:

requirement = request.data['requirement']
# requirement = request.__getitem__('requirement')
它将调用
QueryDict.\uuuu getitem\uuuuu(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。它定义了执行POST请求时在中使用的
create
perform\u 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__'