有一项任务是解析csv文件,并根据收到的数据在数据库中创建实例。在后端-DRF和前端-React。具体功能是文件处理不是完全隐藏的。逻辑如下:有一个用于加载文件的按钮。该文件已加载并验证,但是不会立即在数据库中创建任何内容。将出现一个窗口,其中列出了已保存的数据(如表),并且在此窗口中,有一个新按钮,可通过单击已请求数据库的按钮来确认。
我刚刚做的事情:1.创建一个类来下载文件(“上传”按钮)
class FileUploadView(APIView):
parser_classes = ( MultiPartParser, FormParser)
renderer_classes = [JSONRenderer]
def put(self, request, format=None):
if 'file' not in request.data:
raise ParseError("Empty content")
f = request.data['file']
filename = f.name
if filename.endswith('.csv'):
file = default_storage.save(filename, f)
r = csv_file_parser(file)
status = 204
else:
status = 406
r = "File format error"
return Response(r, status=status)
在该类中,调用csv_file_parser函数,其结果是包含所有已保存数据的json,如下所示:
{
"1": {
"Vendor": "Firstvendortestname",
"Country": "USA",
...
...
"Modules": "Module1",
" NDA date": "2019-12-24"
},
"2": {
"Vendor": "Secondvendortestname",
"Country": "Canada",
...
...
"Modules": "Module1",
" NDA date": "2019-12-24"
}
}
通过单击“确认”按钮,此数据将用于预览将在基础中创建模型实例的字段。
csv_file_parser函数
def csv_file_parser(file):
result_dict = {}
with open(file) as csvfile:
reader = csv.DictReader(csvfile)
line_count = 1
for rows in reader:
for key, value in rows.items():
if not value:
raise ParseError('Missing value in file. Check the {} line'.format(line_count))
result_dict[line_count] = rows
line_count += 1
return result_dict
按下“确认”按钮后,React会将这些数据作为参数传递给使用POST方法与数据库一起使用的类。随着本课程的实施,我遇到了困难。如何正确处理接收到的数据并将其记录在数据库中?
class CsvToDatabase(APIView):
def post(self, request, format=None):
data = request.data
for vendor in data:
Vendors(
vendor_name=vendor['Vendor'],
country=vendor['Country']
).save()
return Response({'received data': request.data})
此代码给出错误
TypeError at /api/v1/vendors/from_csv_create/
string indices must be integers
打印request.data输出
<QueryDict: {'{\n "1": {\n "Vendor": "Firstvendortestname",\n "Country": "USA",\n "Primary Contact Name": "Jack Jhonson",\n "Primary Contact Email": "[email protected]",\n "Secondary Contact Name": "Jack2 Jhonson",\n "Secondary Contact Email": "[email protected]",\n "Modules": "Module1, Module2",\n " NDA date": "2019-12-24"\n },\n "2": {\n "Vendor": "Secondvendortestname",\n "Country": "Canada",\n "Primary Contact Name": "Sandra Bullock",\n "Primary Contact Email": "[email protected]",\n "Secondary Contact Name": "Sandra Bullock",\n "Secondary Contact Email": "[email protected]",\n "Modules": "Module1, Module2",\n " NDA date": "2019-12-24"\n }\n}': ['']}>
也许我使用了错误的数据格式?
总体而言,我感觉自己在做错工作。我不使用串行器,在这里需要它们吗?
您遍历字典键,但应遍历项:
for key, vendor in data.items():
Vendors(
vendor_name=vendor['Vendor'],
country=vendor['Country']
).save()
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句