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__'