Django REST上传CSV返回所有帖子的响应



我有一个运行良好的博客CMS,但我希望能够上传一个带有多个测试帖子的CSV,然后一次将它们添加到数据库中。现在我可以上传CSV并遍历行,但因为我的POST函数返回一个响应,所以它在一次迭代后就退出了。如何让它遍历所有行,然后返回创建的博客文章列表?

这是我的代码,可以一次创建一个:

class PostsImportAPIView(generics.ListCreateAPIView):
serializer_class    = DashboardPostSerializer
permission_classes  = [IsOwner]
pagination_class    = BlogPostPagination
def get_queryset(self, *args, **kwargs):
return BlogPost.objects.all()
def post(self, request, *args, **kwargs):
if request.FILES:
data = request.data
else:
data = request.data.copy()
csv_file = TextIOWrapper(data['csv'].file, encoding='ascii', errors='replace')
import_csv = csv.reader(csv_file)
next(import_csv)
counter = 0
for line in import_csv:
if line:
data['title'] = line[0]
data['body'] = line[1]
date_field  = line[2].split('+')
data['created_at']  = datetime.datetime.strptime(date_field[0], '%Y-%m-%d %H:%M:%S.%f')
data['published'] = line[3]
serializer  = DashboardPostImportSerializer(data=data, context={'request': request})
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这对一次一个更有效,但我想做的是为每个完成的行增加计数器,然后返回一个与计数器长度匹配的帖子查询集。但由于返回我的响应打破了循环,我不确定下一步该怎么做。

感谢kiwibg,这是工作代码。它遍历csv并创建所有的post,尽管最终的序列化程序只返回最后创建的post。但就预期目的而言,这已经足够好了。

class PostsImportAPIView(generics.ListCreateAPIView):
serializer_class    = DashboardPostSerializer
permission_classes  = [IsOwner]
pagination_class    = BlogPostPagination
def get_queryset(self, *args, **kwargs):
return BlogPost.objects.all()
def post(self, request, *args, **kwargs):
if request.FILES:
data = request.data
else:
data = request.data.copy()
csv_file = TextIOWrapper(data['csv'].file, encoding='ascii', errors='replace')
import_csv = csv.reader(csv_file)
next(import_csv)
counter = 0
for line in import_csv:
if line:
data['title'] = line[0]
data['body'] = line[1]
date_field  = line[2].split('+')
data['created_at']  = datetime.datetime.strptime(date_field[0], '%Y-%m-%d %H:%M:%S.%f')
data['published'] = line[3]
serializer  = DashboardPostImportSerializer(data=data, context={'request': request})
if serializer.is_valid(raise_exception=True):
counter += 1
serializer.save()
if serializer.is_valid(raise_exception=True):
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

最新更新