fastgenerateapi 1.2.33__tar.gz → 1.2.35__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/PKG-INFO +1 -1
  2. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/__version__.py +1 -1
  3. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/file_tool/xlsx_util.py +43 -36
  4. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi.egg-info/PKG-INFO +1 -1
  5. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/LICENSE +0 -0
  6. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/README.md +0 -0
  7. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/__init__.py +0 -0
  8. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/__init__.py +0 -0
  9. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/api_view.py +0 -0
  10. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/base_view.py +0 -0
  11. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/create_view.py +0 -0
  12. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/delete_filter_view.py +0 -0
  13. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/delete_tree_view.py +0 -0
  14. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/delete_view.py +0 -0
  15. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/get_all_view.py +0 -0
  16. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/get_one_view.py +0 -0
  17. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/get_relation_view.py +0 -0
  18. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/get_tree_view.py +0 -0
  19. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  20. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/mixin/base_mixin.py +0 -0
  21. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +0 -0
  22. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
  23. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
  24. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
  25. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
  26. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
  27. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/switch_view.py +0 -0
  28. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/update_relation_view.py +0 -0
  29. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/api_view/update_view.py +0 -0
  30. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/cache/__init__.py +0 -0
  31. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/cache/cache_decorator.py +0 -0
  32. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/cache/key_builder.py +0 -0
  33. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/channel/__init__.py +0 -0
  34. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/channel/connection_manager.py +0 -0
  35. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/channel/consumer.py +0 -0
  36. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/channel/websocket_view.py +0 -0
  37. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/controller/__init__.py +0 -0
  38. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/controller/filter_controller.py +0 -0
  39. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/controller/router_controller.py +0 -0
  40. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/controller/rpc_controller.py +0 -0
  41. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/controller/search_controller.py +0 -0
  42. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/controller/ws_controller.py +0 -0
  43. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/data_type/__init__.py +0 -0
  44. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/data_type/data_type.py +0 -0
  45. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  46. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/data_type/tortoise_type.py +0 -0
  47. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/deps/__init__.py +0 -0
  48. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/deps/filter_params_deps.py +0 -0
  49. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/deps/tree_params_deps.py +0 -0
  50. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/example/__init__.py +0 -0
  51. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/example/models.py +0 -0
  52. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/example/routers.py +0 -0
  53. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/example/schemas.py +0 -0
  54. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/example/views.py +0 -0
  55. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
  56. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/fastapi_utils/all.py +0 -0
  57. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
  58. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
  59. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/fastapi_utils/tortoise_utils.py +0 -0
  60. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/file_tool/__init__.py +0 -0
  61. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/file_tool/common.py +0 -0
  62. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/file_tool/docx_util.py +0 -0
  63. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/file_tool/file_util.py +0 -0
  64. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/file_tool/pdf_util.py +0 -0
  65. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/file_tool/zip_util.py +0 -0
  66. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/model/__init__.py +0 -0
  67. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/model/base_model.py +0 -0
  68. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/my_fields/__init__.py +0 -0
  69. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/my_fields/aes_field.py +0 -0
  70. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/my_fields/enum_field.py +0 -0
  71. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/my_fields/pk_field.py +0 -0
  72. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  73. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
  74. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/my_fields/validator.py +0 -0
  75. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  76. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/pydantic_utils/base_model.py +0 -0
  77. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
  78. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
  79. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  80. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/common_function.py +0 -0
  81. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
  82. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/create_schema_factory.py +0 -0
  83. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/filter_schema_factory.py +0 -0
  84. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +0 -0
  85. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +0 -0
  86. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
  87. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
  88. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
  89. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
  90. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/schemas_factory/update_schema_factory.py +0 -0
  91. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/__init__.py +0 -0
  92. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/all_settings.py +0 -0
  93. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/app_settings.py +0 -0
  94. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/db_settings.py +0 -0
  95. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/etcd_settings.py +0 -0
  96. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/file_settings.py +0 -0
  97. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/jwt_settings.py +0 -0
  98. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/otlp_settings.py +0 -0
  99. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/redis_settings.py +0 -0
  100. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/sms_settings.py +0 -0
  101. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/settings/system_settings.py +0 -0
  102. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/utils/__init__.py +0 -0
  103. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/utils/aes.py +0 -0
  104. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/utils/auto_discover.py +0 -0
  105. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/utils/exception.py +0 -0
  106. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/utils/pwd_utils.py +0 -0
  107. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/utils/ramdom_utils.py +0 -0
  108. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/utils/snowflake.py +0 -0
  109. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/utils/str_util.py +0 -0
  110. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/utils/swagger_to_js.py +0 -0
  111. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/validator/__init__.py +0 -0
  112. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi/validator/validator.py +0 -0
  113. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi.egg-info/SOURCES.txt +0 -0
  114. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  115. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/fastgenerateapi.egg-info/top_level.txt +0 -0
  116. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/script/__init__.py +0 -0
  117. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/setup.cfg +0 -0
  118. {fastgenerateapi-1.2.33 → fastgenerateapi-1.2.35}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.33
3
+ Version: 1.2.35
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (1, 2, 33)
11
+ VERSION = (1, 2, 35)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -123,42 +123,47 @@ class XlsxImporterImpl(XlsxImporterInterface):
123
123
  def __init__(self, file: Optional[UploadFile], *args, **kwargs):
124
124
  self.file = file
125
125
  self.args = args
126
+ self.kwargs = kwargs
127
+ # 初始化时预计算常量,避免循环内重复计算
126
128
  self.required_field_dict = {field: True for field in self.required_fields} if self.required_fields else {}
127
129
  self.field_title_dict = {self.fields[i]: self.xlsx_headers[i] for i in range(len(self.fields))}
128
- self.kwargs = kwargs
130
+ self.fields_length = len(self.fields) if self.fields else 0
129
131
 
130
132
  # ------------------------------ 钩子函数 ------------------------------------
131
133
  async def handle_data(self, rows: List[Dict[str, str]]):
132
134
  if not self.model_class:
133
- raise NotImplementedError
134
- create_list = []
135
+ raise NotImplementedError("model_class must be set")
136
+
135
137
  global_dict = {}
136
138
  if self.fields_handler:
137
139
  if is_async_callable(self.fields_handler):
138
140
  rows = await self.fields_handler(rows, *self.args, **self.kwargs, global_dict=global_dict)
139
141
  else:
140
142
  rows = self.fields_handler(rows, *self.args, **self.kwargs, global_dict=global_dict)
143
+ processed_rows = []
141
144
  for row in rows:
142
145
  try:
146
+ # 前置处理
143
147
  if self.field_before_handler_list:
144
- for field_before_handler in self.field_before_handler_list:
145
- if is_async_callable(field_before_handler):
146
- row = await field_before_handler(row, *self.args, **self.kwargs, global_dict=global_dict)
148
+ for handler in self.field_before_handler_list:
149
+ if is_async_callable(handler):
150
+ row = await handler(row, *self.args, **self.kwargs, global_dict=global_dict)
147
151
  else:
148
- row = field_before_handler(row, *self.args, **self.kwargs, global_dict=global_dict)
152
+ row = handler(row, *self.args, **self.kwargs, global_dict=global_dict)
153
+ # 数据验证
149
154
  if self.create_schema:
150
155
  create_dict = self.create_schema(**row).model_dump(exclude_unset=True)
151
156
  else:
152
157
  create_dict = row
158
+ # 后置处理
153
159
  if self.field_after_handler_list:
154
- for field_after_handler in self.field_after_handler_list:
155
- if is_async_callable(field_after_handler):
156
- create_dict = await field_after_handler(create_dict, *self.args, **self.kwargs, global_dict=global_dict)
160
+ for handler in self.field_after_handler_list:
161
+ if is_async_callable(handler):
162
+ create_dict = await handler(create_dict, *self.args, **self.kwargs, global_dict=global_dict)
157
163
  else:
158
- create_dict = field_after_handler(create_dict, *self.args, **self.kwargs, global_dict=global_dict)
159
- if not create_dict:
160
- continue
161
- create_obj = self.model_class(**create_dict)
164
+ create_dict = handler(create_dict, *self.args, **self.kwargs, global_dict=global_dict)
165
+ if create_dict:
166
+ processed_rows.append(self.model_class(**create_dict))
162
167
  except ValidationError as e:
163
168
  alise_dict = ToolMixin.get_schema_alise_to_name(self.create_schema)
164
169
  _error_field = e.errors()[0].get('loc')[0]
@@ -167,9 +172,9 @@ class XlsxImporterImpl(XlsxImporterInterface):
167
172
  if not row.get(error_field):
168
173
  return ResponseMixin.error(msg=f"第{row['_row_index']}行【{description}】不能为空")
169
174
  return ResponseMixin.error(msg=f"第{row['_row_index']}行【{description}】填写错误")
170
- create_list.append(create_obj)
171
- await self.model_class.bulk_create(create_list)
172
- return create_list
175
+ if processed_rows:
176
+ await self.model_class.bulk_create(processed_rows)
177
+ return processed_rows
173
178
 
174
179
  async def upload_file(self, bytes_io: io.BytesIO):
175
180
  raise NotImplementedError
@@ -180,28 +185,28 @@ class XlsxImporterImpl(XlsxImporterInterface):
180
185
  async def push_status_error(self, msg: Optional[str]):
181
186
  raise NotImplementedError
182
187
 
183
- async def validate_field(self, row_value):
184
-
188
+ def validate_field(self, row_value):
189
+ """字段验证逻辑"""
185
190
  return row_value
186
191
 
187
192
  # ------------------------------ 复用函数 ------------------------------------
188
193
  async def check_headers(self, row: tuple[Cell, ...]):
189
194
  if not self.xlsx_headers:
190
- raise NotImplementedError
191
- header_list = []
192
- for col_index, col in enumerate(row):
193
- header_list.append(col.value)
195
+ raise NotImplementedError("xlsx_headers must be set")
196
+ header_list = [cell.value for cell in row]
194
197
  if len(header_list) != len(self.xlsx_headers):
195
- return ResponseMixin.error(msg="文件首行长度校验错误")
198
+ return ResponseMixin.error(msg=f"文件首行长度错误,期望{len(self.xlsx_headers)}列,实际{len(header_list)}列")
196
199
  if not operator.eq(header_list, self.xlsx_headers):
197
- return ResponseMixin.error(msg="文件首行内容校验错误")
200
+ return ResponseMixin.error(msg="文件首行内容校验错误,请检查导入模板是否正确")
198
201
 
199
202
  return
200
203
 
201
204
  async def get_data_dict(self, sh: Worksheet) -> List[Dict[str, str]]:
202
205
  data_list = []
203
- for row_index in range(2, sh.max_row + 1):
204
- row_data = await self.row_to_dict(sh[row_index], row_index)
206
+ # 使用iter_rows批量读取,利用只读模式优势
207
+ rows = sh.iter_rows(min_row=2, max_row=sh.max_row, values_only=False)
208
+ for row_index, row in enumerate(rows, start=2):
209
+ row_data = self.row_to_dict(row, row_index)
205
210
  if not row_data:
206
211
  continue
207
212
  row_data["_row_index"] = row_index
@@ -209,22 +214,26 @@ class XlsxImporterImpl(XlsxImporterInterface):
209
214
 
210
215
  return data_list
211
216
 
212
- async def row_to_dict(self, row, row_index) -> dict:
217
+ def row_to_dict(self, row, row_index) -> dict:
213
218
  row_data = {}
214
- error_msg = ""
215
- for i in range(min(len(row), len(self.fields))):
219
+ error_msg = None
220
+ has_value = False
221
+ for i in range(min(len(row), self.fields_length)):
216
222
  field = self.fields[i]
217
- row_value = row[i].value
223
+ cell = row[i]
224
+ row_value = cell.value if cell else None
218
225
  if row_value in [None, "", " "]:
219
226
  row_value = None
220
227
  elif isinstance(row_value, int):
221
228
  row_value = str(row_value)
222
- row_value = await self.validate_field(row_value)
229
+ row_value = self.validate_field(row_value)
223
230
  if self.required_field_dict.get(field) and not row_value:
224
231
  if not error_msg:
225
232
  error_msg = f"第{row_index}行【{self.field_title_dict.get(field)}】不能为空"
226
- row_data[self.fields[i]] = row_value
227
- if any(row_data.values()):
233
+ row_data[field] = row_value
234
+ if row_value:
235
+ has_value = True
236
+ if has_value:
228
237
  if error_msg:
229
238
  return ResponseMixin.error(msg=error_msg)
230
239
  return row_data
@@ -377,7 +386,6 @@ class XlsxUtil:
377
386
  try:
378
387
  # 校验表头信息
379
388
  await importer.check_headers(sh[1])
380
-
381
389
  # 读取excel数据
382
390
  rows = await importer.get_data_dict(sh)
383
391
  finally:
@@ -387,7 +395,6 @@ class XlsxUtil:
387
395
  return ResponseMixin.error(msg="导入数据不能为空")
388
396
  # 处理完整数据
389
397
  await importer.handle_data(rows)
390
-
391
398
  return
392
399
 
393
400
  @staticmethod
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.33
3
+ Version: 1.2.35
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com