fastgenerateapi 1.2.17__tar.gz → 1.2.18__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 (117) hide show
  1. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/PKG-INFO +1 -1
  2. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/__init__.py +3 -1
  3. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/__version__.py +1 -1
  4. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/get_all_view.py +5 -3
  5. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/get_relation_view.py +3 -3
  6. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/get_tree_view.py +2 -2
  7. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/base_mixin.py +5 -3
  8. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +28 -6
  9. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +15 -5
  10. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/filter_controller.py +28 -11
  11. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/fastapi_utils/tortoise_utils.py +3 -3
  12. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/pydantic_utils/base_model.py +5 -4
  13. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/filter_schema_factory.py +5 -16
  14. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/app_settings.py +2 -2
  15. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/str_util.py +7 -0
  16. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi.egg-info/PKG-INFO +1 -1
  17. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/LICENSE +0 -0
  18. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/README.md +0 -0
  19. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/__init__.py +0 -0
  20. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/api_view.py +0 -0
  21. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/base_view.py +0 -0
  22. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/create_view.py +0 -0
  23. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/delete_filter_view.py +0 -0
  24. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/delete_tree_view.py +0 -0
  25. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/delete_view.py +0 -0
  26. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/get_one_view.py +0 -0
  27. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  28. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
  29. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
  30. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
  31. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
  32. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
  33. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/docx_util.py +0 -0
  34. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/file_util.py +0 -0
  35. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/pdf_util.py +0 -0
  36. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/zip_util.py +0 -0
  37. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/switch_view.py +0 -0
  38. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/update_relation_view.py +0 -0
  39. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/update_view.py +0 -0
  40. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/cache/__init__.py +0 -0
  41. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/cache/cache_decorator.py +0 -0
  42. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/cache/key_builder.py +0 -0
  43. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/channel/__init__.py +0 -0
  44. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/channel/connection_manager.py +0 -0
  45. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/channel/consumer.py +0 -0
  46. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/channel/websocket_view.py +0 -0
  47. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/__init__.py +0 -0
  48. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/router_controller.py +0 -0
  49. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/rpc_controller.py +0 -0
  50. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/search_controller.py +0 -0
  51. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/ws_controller.py +0 -0
  52. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/data_type/__init__.py +0 -0
  53. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/data_type/data_type.py +0 -0
  54. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  55. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/data_type/tortoise_type.py +0 -0
  56. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/deps/__init__.py +0 -0
  57. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/deps/filter_params_deps.py +0 -0
  58. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/deps/tree_params_deps.py +0 -0
  59. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/example/__init__.py +0 -0
  60. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/example/models.py +0 -0
  61. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/example/routers.py +0 -0
  62. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/example/schemas.py +0 -0
  63. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/example/views.py +0 -0
  64. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
  65. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/fastapi_utils/all.py +0 -0
  66. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
  67. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
  68. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/model/__init__.py +0 -0
  69. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/model/base_model.py +0 -0
  70. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/__init__.py +0 -0
  71. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/aes_field.py +0 -0
  72. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/enum_field.py +0 -0
  73. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/pk_field.py +0 -0
  74. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  75. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
  76. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/validator.py +0 -0
  77. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  78. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
  79. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
  80. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  81. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/common_function.py +0 -0
  82. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
  83. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/create_schema_factory.py +0 -0
  84. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +0 -0
  85. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +0 -0
  86. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
  87. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
  88. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
  89. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
  90. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/update_schema_factory.py +0 -0
  91. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/__init__.py +0 -0
  92. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/all_settings.py +0 -0
  93. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/db_settings.py +0 -0
  94. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/etcd_settings.py +0 -0
  95. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/file_settings.py +0 -0
  96. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/jwt_settings.py +0 -0
  97. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/otlp_settings.py +0 -0
  98. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/redis_settings.py +0 -0
  99. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/sms_settings.py +0 -0
  100. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/system_settings.py +0 -0
  101. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/__init__.py +0 -0
  102. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/aes.py +0 -0
  103. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/auto_discover.py +0 -0
  104. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/exception.py +0 -0
  105. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/file_utils.py +0 -0
  106. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/pwd_utils.py +0 -0
  107. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/ramdom_utils.py +0 -0
  108. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/snowflake.py +0 -0
  109. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/swagger_to_js.py +0 -0
  110. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/validator/__init__.py +0 -0
  111. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi/validator/validator.py +0 -0
  112. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi.egg-info/SOURCES.txt +0 -0
  113. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  114. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/fastgenerateapi.egg-info/top_level.txt +0 -0
  115. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/script/__init__.py +0 -0
  116. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/setup.cfg +0 -0
  117. {fastgenerateapi-1.2.17 → fastgenerateapi-1.2.18}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.17
3
+ Version: 1.2.18
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -25,12 +25,14 @@ from fastgenerateapi.channel.websocket_view import WebsocketView
25
25
  from fastgenerateapi.channel.consumer import Consumer
26
26
 
27
27
  # 模型相关类
28
- from fastgenerateapi.pydantic_utils.base_model import model_config, BaseModel, IdList
28
+ from fastgenerateapi.pydantic_utils.base_model import (
29
+ model_config, BaseModel, PagePydantic, EmptyPydantic, SearchPydantic, IdList, IdResp)
29
30
 
30
31
  # 类型提示
31
32
  from fastgenerateapi.data_type.tortoise_type import T_Model
32
33
 
33
34
  # 工具相关
35
+ from fastgenerateapi.controller.filter_controller import FilterUtils
34
36
  from fastgenerateapi.api_view.mixin.utils.docx_util import DocxUtil
35
37
  from fastgenerateapi.api_view.mixin.utils.file_util import FileUtil
36
38
  from fastgenerateapi.api_view.mixin.utils.pdf_util import PdfUtil
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (1, 2, 17)
11
+ VERSION = (1, 2, 18)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -90,7 +90,9 @@ class GetAllView(BaseView, GetMixin):
90
90
 
91
91
  async def set_get_all_model_list(self, model_list: List[T_Model], *args, **kwargs) -> List[T_Model]:
92
92
  """
93
- 对于查询的model,展示数据处理
93
+ 对于查询的model列表进行数据处理
94
+ 使用场景示例:
95
+ model的某个id通过http请求获取相关信息。此处统一请求,储存在kwargs["extra_filters"]里,在set_get_all_model赋值
94
96
  """
95
97
  return model_list
96
98
 
@@ -225,8 +227,8 @@ class GetAllView(BaseView, GetMixin):
225
227
  def _handler_get_all_settings(self):
226
228
  if not self.get_all_route:
227
229
  return
228
- self.search_controller = SearchController(self.get_base_filter(self.search_fields))
229
- self.filter_controller = FilterController(self.get_base_filter(self.filter_fields, self.filter_schema))
230
+ self.search_controller = SearchController(self.get_base_filter(self.search_fields, model_class=self.model_class))
231
+ self.filter_controller = FilterController(self.get_base_filter(self.filter_fields, self.filter_schema, model_class=self.model_class))
230
232
 
231
233
  func_type = inspect.signature(self.get_all).return_annotation
232
234
  if func_type != inspect._empty and func_type is not None:
@@ -177,9 +177,9 @@ class GetRelationView(BaseView):
177
177
  def _handler_get_relation_settings(self):
178
178
  if not self.get_relation_route:
179
179
  return
180
- self.search_controller = SearchController(self.get_base_filter(self.search_fields))
181
- self.filter_controller = FilterController(self.get_base_filter(self.filter_fields))
182
- self.filter_relation_controller = FilterController(self.get_base_filter(self.relation_filter_fields))
180
+ self.search_controller = SearchController(self.get_base_filter(self.search_fields, model_class=self.model_class))
181
+ self.filter_controller = FilterController(self.get_base_filter(self.filter_fields, model_class=self.model_class))
182
+ self.filter_relation_controller = FilterController(self.get_base_filter(self.relation_filter_fields, model_class=self.model_class))
183
183
 
184
184
  func_type = inspect.signature(self.get_relation).return_annotation
185
185
  if func_type != inspect._empty and func_type is not None:
@@ -178,8 +178,8 @@ class GetTreeView(BaseView):
178
178
  def _handler_get_tree_settings(self):
179
179
  if not self.get_tree_route:
180
180
  return
181
- self.search_controller = SearchController(self.get_base_filter(self.search_fields))
182
- self.filter_controller = FilterController(self.get_base_filter(self.filter_fields))
181
+ self.search_controller = SearchController(self.get_base_filter(self.search_fields, model_class=self.model_class))
182
+ self.filter_controller = FilterController(self.get_base_filter(self.filter_fields, model_class=self.model_class))
183
183
 
184
184
  func_type = inspect.signature(self.get_tree).return_annotation
185
185
  if func_type != inspect._empty and func_type is not None:
@@ -4,6 +4,8 @@ from typing import List, Callable, Any, Union, Optional, Generic, Type
4
4
 
5
5
  from fastapi import APIRouter
6
6
  from fastapi.types import DecoratedCallable
7
+ from tortoise import Model
8
+
7
9
  from fastgenerateapi.utils.exception import NOT_FOUND
8
10
 
9
11
  from fastgenerateapi.controller.filter_controller import BaseFilter
@@ -48,12 +50,12 @@ class BaseMixin(Generic[T], APIRouter, ABC):
48
50
  getattr(self, route_field_func)()
49
51
 
50
52
  @staticmethod
51
- def get_base_filter(fields: list, schema: Optional[PYDANTIC_SCHEMA] = None) -> list:
53
+ def get_base_filter(fields: list, schema: Optional[PYDANTIC_SCHEMA] = None, model_class: Optional[Type[Model]] = None) -> list:
52
54
  bast_filter_list = []
53
55
  if fields:
54
- bast_filter_list += [BaseFilter(field) if not isinstance(field, BaseFilter) else field for field in fields]
56
+ bast_filter_list += [BaseFilter(field, model_class) if not isinstance(field, BaseFilter) else field for field in fields]
55
57
  if schema:
56
- bast_filter_list += [BaseFilter((field, model_field.alias)) for field, model_field in schema.__fields__.items()]
58
+ bast_filter_list += [BaseFilter((field, model_field.alias), model_class) for field, model_field in schema.model_fields.items()]
57
59
  return bast_filter_list
58
60
 
59
61
  @staticmethod
@@ -22,6 +22,10 @@ class DBModelMixin:
22
22
  except:
23
23
  return "id"
24
24
 
25
+ @staticmethod
26
+ def get_model_description(model_class: Optional[Type[Model]]) -> str:
27
+ return model_class._meta.table_description or model_class.__name__
28
+
25
29
  @staticmethod
26
30
  def get_field_description(model_class: Type[Model], fields: Union[str, list, tuple, set]) -> str:
27
31
  if fields in ["id", "pk"]:
@@ -39,10 +43,7 @@ class DBModelMixin:
39
43
  description = ""
40
44
  description += DBModelMixin.get_field_description(model_class=model_class, fields=field_list[0])
41
45
  if field_list[1] in DBModelMixin.others_description:
42
- description += DBModelMixin.get_field_description(
43
- model_class=model_class,
44
- fields=field_list[1]
45
- )
46
+ description += DBModelMixin.others_description.get(field_list[1], "")
46
47
  else:
47
48
  description += DBModelMixin.get_field_description(
48
49
  model_class=DBModelMixin._get_foreign_key_relation_class(model_class=model_class, field=field_list[0]),
@@ -65,8 +66,29 @@ class DBModelMixin:
65
66
  return ",".join(list(fields))
66
67
 
67
68
  @staticmethod
68
- def get_model_description(model_class: Optional[Type[Model]]) -> str:
69
- return model_class._meta.table_description or model_class.__name__
69
+ def get_model_field_type(model_class: Optional[Type[Model]], field: str) -> type:
70
+ if field in ["id", "pk"]:
71
+ return str
72
+ try:
73
+ field_info = model_class._meta.fields_map.get(field)
74
+ field_info_fk = model_class._meta.fields_map.get(field.removesuffix("_id"))
75
+ if field_info:
76
+ return field_info.field_type
77
+ elif field.endswith("_id") and field_info_fk:
78
+ return str
79
+ elif "__" in field:
80
+ field_list = field.split("__", maxsplit=1)
81
+ if field_list[1] in DBModelMixin.others_description:
82
+ return DBModelMixin.get_model_field_type(model_class, field_list[0])
83
+ else:
84
+ return DBModelMixin.get_model_field_type(
85
+ model_class=DBModelMixin._get_foreign_key_relation_class(model_class=model_class, field=field_list[0]),
86
+ field=field_list[1]
87
+ )
88
+ else:
89
+ return str
90
+ except Exception as e:
91
+ return str
70
92
 
71
93
  @staticmethod
72
94
  def get_model_prefix_name(model_class: Type[Model]) -> str:
@@ -89,12 +89,15 @@ class XlsxUtil:
89
89
  model_list: List[Model],
90
90
  fields: List[str],
91
91
  index: Optional[bool] = False,
92
+ model_handler: Callable = None,
92
93
  model_handler_list: List[Callable] = None,
93
94
  fields_handler: dict = None,
94
95
  filename: Optional[str] = '导出文件.xlsx',
95
96
  file_save_path: Optional[str] = None,
96
97
  sheet: Optional[str] = None,
97
98
  model_class: Optional[Model] = None,
99
+ *args,
100
+ **kwargs,
98
101
  ) -> StreamingResponse:
99
102
  """
100
103
  导出excel文件
@@ -102,7 +105,8 @@ class XlsxUtil:
102
105
  :param model_list: 模型列表
103
106
  :param fields: 字段列表
104
107
  :param index: 是否导出序号字段
105
- :param model_handler_list: 模型列表
108
+ :param model_handler: 模型列表的处理方法
109
+ :param model_handler_list: 单个模型处理方法
106
110
  :param fields_handler: 字段处理方法
107
111
  :param filename: 导出文件名
108
112
  :param file_save_path: 指定文件路径保存,不返回
@@ -128,13 +132,19 @@ class XlsxUtil:
128
132
 
129
133
  col_width_list = XlsxUtil.write_headers(sh, headers)
130
134
 
135
+ if model_handler:
136
+ if is_async_callable(model_handler):
137
+ model_list = await model_handler(model_list, *args, **kwargs)
138
+ else:
139
+ model_list = model_handler(model_list, *args, **kwargs)
140
+
131
141
  for row, model in enumerate(model_list, start_row + 1):
132
142
  if model_handler_list:
133
143
  for model_handler in model_handler_list:
134
144
  if is_async_callable(model_handler):
135
- model = await model_handler(model)
145
+ model = await model_handler(model, *args, **kwargs)
136
146
  else:
137
- model = model_handler(model)
147
+ model = model_handler(model, *args, **kwargs)
138
148
  start_col = 1
139
149
  if index:
140
150
  write(sh, row, start_col, str(row-start_row))
@@ -144,9 +154,9 @@ class XlsxUtil:
144
154
  handler = fields_handler.get(field)
145
155
  if handler and hasattr(handler, "__call__"):
146
156
  if is_async_callable(handler):
147
- info = await handler(info)
157
+ info = await handler(info, *args, **kwargs)
148
158
  else:
149
- info = handler(info)
159
+ info = handler(info, *args, **kwargs)
150
160
  write(sh, row, col, info)
151
161
 
152
162
  XlsxUtil.adaptive_format(sh, col_width_list, len(headers))
@@ -1,11 +1,13 @@
1
1
  from datetime import datetime, date, time
2
- from typing import Union, Any, Optional
2
+ from typing import Union, Any, Optional, Type
3
3
 
4
4
  from pydantic.fields import FieldInfo
5
+ from tortoise import Model
5
6
  from tortoise.expressions import Q
6
7
  from tortoise.queryset import QuerySet
7
8
 
8
- from fastgenerateapi.settings.all_settings import settings
9
+ from fastgenerateapi.api_view.mixin.dbmodel_mixin import DBModelMixin
10
+ from fastgenerateapi.pydantic_utils.base_model import alias_generator
9
11
 
10
12
 
11
13
  class FilterUtils:
@@ -53,18 +55,20 @@ class BaseFilter:
53
55
  BaseFilter
54
56
  """
55
57
 
56
- def __init__(self, filter_str: Union[str, tuple]):
58
+ def __init__(self, filter_str: Union[str, tuple], model_class: Optional[Type[Model]] = None):
57
59
  """
58
- :param filter_str: Union[str, tuple]
60
+ :param
61
+ filter_str: Union[str, tuple]
59
62
  当tuple时,第一个为str,后面参数无顺序和数量要求,可以是 类型、重命名字符串、用于修改传值的方法
60
- example:
61
- name__contains
62
- (create_at__gt, datetime)
63
- (create_at__gt, datetime, create_time)
64
- (publish_date, datetime, FilterUtils.date_to_datetime_23)
65
- (publish_date, datetime, FieldInfo())
63
+ example:
64
+ name__contains
65
+ (create_at__gt, datetime)
66
+ (create_at__gt, datetime, create_time)
67
+ (publish_date, datetime, FilterUtils.date_to_datetime_23)
68
+ (publish_date, datetime, FieldInfo())
69
+ model_class: 当有值时,会从这里获取到相关的类型和备注
66
70
  """
67
- field_type = str
71
+ field_type = None
68
72
  model_field = filter_str
69
73
  filter_field = None
70
74
  field_info = None
@@ -85,6 +89,19 @@ class BaseFilter:
85
89
  if not filter_field:
86
90
  filter_field = model_field
87
91
 
92
+ if not field_type:
93
+ if model_class:
94
+ field_type = DBModelMixin.get_model_field_type(model_class, model_field)
95
+ else:
96
+ field_type = str
97
+
98
+ if not field_info:
99
+ description = DBModelMixin.get_field_description(model_class, model_field)
100
+ field_info = FieldInfo(default=None, title=description, description=description)
101
+
102
+ if alias_generator:
103
+ field_info.alias = alias_generator(filter_field or model_field)
104
+
88
105
  self.field_type = field_type
89
106
  self.model_field = model_field
90
107
  self.filter_field = filter_field
@@ -12,7 +12,7 @@ def _get_connection(connection_name: Optional[str]) -> BaseDBAsyncClient:
12
12
  :param connection_name:
13
13
  :return:
14
14
  """
15
- # tortoise-orm==0.25.1
15
+ # 来源 tortoise-orm==0.25.1
16
16
  # if connection_name:
17
17
  # connection = connections.get(connection_name)
18
18
  # elif len(connections.db_config) == 1:
@@ -28,7 +28,7 @@ def _get_connection(connection_name: Optional[str]) -> BaseDBAsyncClient:
28
28
  connection = connections.get(connection_name)
29
29
  elif len(connections.db_config) >= 1:
30
30
  # 默认选排序第一个
31
- connection_name = next(iter(connections.db_config.keys()))
31
+ connection_name = connections.db_config.get("default") or next(iter(connections.db_config.keys()))
32
32
  connection = connections.get(connection_name)
33
33
  else:
34
34
  raise ParamsError(
@@ -42,7 +42,7 @@ def ForeignKeyField(
42
42
  model_name: str,
43
43
  related_name: Union[str, None, Literal[False]] = None,
44
44
  on_delete: OnDelete = CASCADE,
45
- db_constraint: bool = True,
45
+ db_constraint: bool = False,
46
46
  null: bool = False,
47
47
  **kwargs: Any,
48
48
  ) -> Union[ForeignKeyRelation[MODEL], ForeignKeyNullableRelation[MODEL]]:
@@ -98,10 +98,6 @@ class PagePydantic(BaseModel):
98
98
  return data
99
99
 
100
100
 
101
- class IdList(BaseModel):
102
- id_list: List[str] = Field([], description="id数组")
103
-
104
-
105
101
  class EmptyPydantic(BaseModel):
106
102
  ...
107
103
 
@@ -110,5 +106,10 @@ class SearchPydantic(BaseModel):
110
106
  search: Optional[str] = Field(None, description="搜索")
111
107
 
112
108
 
109
+ class IdList(BaseModel):
110
+ id_list: List[str] = Field([], description="id数组")
111
+
113
112
 
113
+ class IdResp(BaseModel):
114
+ id: str = Field(..., description="主键")
114
115
 
@@ -1,11 +1,9 @@
1
- from typing import Type, Union, Optional
1
+ from logging import warning
2
+ from typing import Type, Optional
2
3
 
3
- from fastapi import Query
4
4
  from pydantic import BaseModel, create_model
5
- from pydantic.fields import FieldInfo
6
5
 
7
6
  from fastgenerateapi.pydantic_utils.base_model import model_config
8
- from fastgenerateapi.api_view.mixin.dbmodel_mixin import DBModelMixin
9
7
  from fastgenerateapi.controller.filter_controller import BaseFilter
10
8
  from tortoise import Model
11
9
 
@@ -20,8 +18,8 @@ def filter_schema_factory(model_class: Type[Model], fields: list[str, tuple[str,
20
18
 
21
19
  for base_field in fields or []:
22
20
  if not isinstance(base_field, BaseFilter):
23
- base_field = BaseFilter(base_field)
24
- f = base_field.filter_field
21
+ base_field = BaseFilter(base_field, model_class)
22
+ f = base_field.model_field
25
23
  t = base_field.field_type
26
24
  if base_field.field_info:
27
25
  model_fields.update({
@@ -31,16 +29,7 @@ def filter_schema_factory(model_class: Type[Model], fields: list[str, tuple[str,
31
29
  )
32
30
  })
33
31
  else:
34
- description = DBModelMixin.get_field_description(model_class, base_field.model_field)
35
- model_fields.update({
36
- f: (
37
- Optional[t],
38
- FieldInfo(
39
- title=f"{description}",
40
- default=Query("", description=description),
41
- description=f"{description}"
42
- ))
43
- })
32
+ warning(f"模型{model_class.__name__}筛选参数{base_field.model_field}未起效果")
44
33
 
45
34
  filter_params_model: Type[BaseModel] = create_model(
46
35
  model_class.__name__+"CommonFilterParams",
@@ -9,9 +9,9 @@ from fastgenerateapi.pydantic_utils.base_settings import BaseSettings
9
9
  class AppSettings(BaseSettings):
10
10
  # ####################################### 请求参数相关 ###############################################
11
11
  # 字段配置
12
- # 【驼峰格式】 推荐<fastgenerateapi.alias_to_camel> 可选<pydantic.alias_generators.to_snake><会忽略双下划线转单下划线配置>
12
+ # 【驼峰格式】 推荐<fastgenerateapi.alias_to_camel> 可选<pydantic.alias_generators.to_camel><会忽略双下划线转单下划线配置>
13
13
  # 【下划线】<pydantic.alias_generators.to_snake>
14
- ALIAS_GENERATOR: Optional[str] = Field(default=None, description="序列化参数命名方法路径")
14
+ ALIAS_GENERATOR: Optional[str] = Field(default="alias_name", description="序列化参数命名方法路径")
15
15
  # 分页对应字段以及配置默认值
16
16
  WHETHER_PAGE_FIELD: Optional[str] = Field(default="no_page", description="判断是否分页字段")
17
17
  CURRENT_PAGE_FIELD: Optional[str] = Field(default="page", description="当前页字段")
@@ -122,6 +122,13 @@ def alias_to_camel(value: str) -> str:
122
122
  return to_camel(value)
123
123
 
124
124
 
125
+ def alias_name(value: str) -> str:
126
+ if settings.app_settings.FILTER_UNDERLINE_WHETHER_DOUBLE_TO_SINGLE:
127
+ value = value.replace("__", "_")
128
+
129
+ return value
130
+
131
+
125
132
  if __name__ == '__main__':
126
133
  # test parse_str_to_list
127
134
  print(parse_str_to_list("我、你,他,她"))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.17
3
+ Version: 1.2.18
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com