如何从CSV文件创建模型实例

杰克逊

有一项任务是解析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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章