amisadmin / fastapi-amis-admin

FastAPI-Amis-Admin is a high-performance, efficient and easily extensible FastAPI admin framework. Inspired by django-admin, and has as many powerful functions as django-admin.
http://docs.amis.work
Apache License 2.0
1.05k stars 154 forks source link

excel批量下载和导入的问题 #176

Open tonyu2019 opened 2 months ago

tonyu2019 commented 2 months ago

首先批量下载,某些时候我们想要的功能是仅导出选中的行,但是导出的依然是所有数据; excel导入,首先按照数据库字段导入,预览的时候就能发现了,被导入的行数是对的,但是数据全是空,导入成功也同样时空。如果按照model中字段的中文title去导入,预览的时候是正确的,但是点击确认导入会提示各个验证(数据库)字段不能为空。

tonyu2019 commented 2 months ago

导入功能解决方案,我这里用的是模型管理,也就是说直接模型继承的fastapi-amis-admin中的ModelAdmin,导入功能在ModelAdmin中get_create_form方法中,在大概899行附近

 for field in fields:
    column = await self.get_list_column(request, self.parser.get_modelfield(field))
    keys[column.name] = "${" + column.label + "}"
    column.name = column.label
    columns.append(column)

在百度的amis input-excel中有这样一句说明,需要保证 input-table 的 name 和 input-excel 一致,同时 columns 中的 name 也需要和 Excel 的列名一致。,所以很明显这里使用了column.label,也就是对应了我们model里定义的字段title(大部分为中文),这肯定和input-table中的name不一致了,自然预览里都是空白行了。

如果你想着input-table的name就用中文,那你上传的excel文件列标题也用中文和input-table对应,那么预览时肯定是没问题了,但是你提交时会报错,因为你提交的数据中都是[{"标题":"ss", "描述":"ss"},……]这样key为中文的数据,跟模型和数据库对应不上,肯定会出现字段验证失败。

所以解决方案还是要和模型/数据表保持一致,具体上述代码修改为:

for field in fields:
    column = await self.get_list_column(request, self.parser.get_modelfield(field))
    keys[column.name] = "${" + column.name + "}"
    columns.append(column)

即可,这样你excel列字段和数据表保持一致,input-table既能解析成功,又可请求上传接口成功。

当然了你就用中文也行,按照官方的,但是你必须要上传接口请求前将字段转为数据接口可接受的就行,毕竟方法不止一种,根据自己的喜好来吧。

另外这个上传还是有些bug,比如title字段是字符串,那么你在excel中这一列全是数字,上传时不会转为字符串的,会直接提示验证失败,后续有时间再做这个兼容吧。