fastgenerateapi 1.1.12__tar.gz → 1.1.14__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.

Potentially problematic release.


This version of fastgenerateapi might be problematic. Click here for more details.

Files changed (114) hide show
  1. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/PKG-INFO +7 -5
  2. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/README.md +6 -4
  3. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/__version__.py +1 -1
  4. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/base_view.py +8 -8
  5. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/get_all_view.py +1 -1
  6. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/get_relation_view.py +1 -1
  7. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +1 -1
  8. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/update_relation_view.py +1 -1
  9. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/controller/filter_controller.py +5 -8
  10. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/controller/rpc_controller.py +1 -1
  11. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/deps/paginator_deps.py +7 -1
  12. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/deps/tree_params_deps.py +7 -1
  13. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/fastapi_utils/param_utils.py +9 -2
  14. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/model/base_model.py +2 -0
  15. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/my_fields/soft_delete_field.py +2 -2
  16. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/pydantic_utils/base_model.py +9 -2
  17. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/common_function.py +18 -4
  18. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/filter_schema_factory.py +6 -3
  19. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/settings/app_settings.py +1 -1
  20. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi.egg-info/PKG-INFO +7 -5
  21. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/LICENSE +0 -0
  22. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/__init__.py +0 -0
  23. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/__init__.py +0 -0
  24. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/api_view.py +0 -0
  25. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/create_view.py +0 -0
  26. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/delete_filter_view.py +0 -0
  27. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/delete_tree_view.py +0 -0
  28. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/delete_view.py +0 -0
  29. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/get_one_view.py +0 -0
  30. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/get_tree_view.py +0 -0
  31. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  32. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/base_mixin.py +0 -0
  33. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
  34. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
  35. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
  36. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
  37. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
  38. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/utils/docx_util.py +0 -0
  39. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/utils/file_util.py +0 -0
  40. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/utils/pdf_util.py +0 -0
  41. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +0 -0
  42. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/mixin/utils/zip_util.py +0 -0
  43. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/sql_get_view.py +0 -0
  44. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/switch_view.py +0 -0
  45. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/api_view/update_view.py +0 -0
  46. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/cache/__init__.py +0 -0
  47. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/cache/cache_decorator.py +0 -0
  48. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/cache/key_builder.py +0 -0
  49. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/channel/__init__.py +0 -0
  50. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/channel/connection_manager.py +0 -0
  51. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/channel/consumer.py +0 -0
  52. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/channel/websocket_view.py +0 -0
  53. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/controller/__init__.py +0 -0
  54. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/controller/router_controller.py +0 -0
  55. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/controller/search_controller.py +0 -0
  56. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/controller/ws_controller.py +0 -0
  57. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/data_type/__init__.py +0 -0
  58. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/data_type/data_type.py +0 -0
  59. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  60. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/deps/__init__.py +0 -0
  61. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/deps/filter_params_deps.py +0 -0
  62. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/example/__init__.py +0 -0
  63. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/example/models.py +0 -0
  64. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/example/routers.py +0 -0
  65. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/example/schemas.py +0 -0
  66. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/example/views.py +0 -0
  67. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
  68. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/fastapi_utils/all.py +0 -0
  69. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
  70. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/model/__init__.py +0 -0
  71. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/my_fields/__init__.py +0 -0
  72. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/my_fields/aes_field.py +0 -0
  73. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/my_fields/enum_field.py +0 -0
  74. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/my_fields/pk_field.py +0 -0
  75. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  76. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/my_fields/validator.py +0 -0
  77. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  78. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
  79. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
  80. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  81. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
  82. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/create_schema_factory.py +0 -0
  83. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +0 -0
  84. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +0 -0
  85. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
  86. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
  87. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
  88. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
  89. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/schemas_factory/update_schema_factory.py +0 -0
  90. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/settings/__init__.py +0 -0
  91. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/settings/all_settings.py +0 -0
  92. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/settings/db_settings.py +0 -0
  93. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/settings/file_settings.py +0 -0
  94. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/settings/jwt_settings.py +0 -0
  95. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/settings/otlp_settings.py +0 -0
  96. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/settings/redis_settings.py +0 -0
  97. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/settings/sms_settings.py +0 -0
  98. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/settings/system_settings.py +0 -0
  99. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/utils/__init__.py +0 -0
  100. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/utils/aes.py +0 -0
  101. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/utils/auto_discover.py +0 -0
  102. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/utils/exception.py +0 -0
  103. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/utils/file_utils.py +0 -0
  104. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/utils/pwd_utils.py +0 -0
  105. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/utils/ramdom_utils.py +0 -0
  106. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/utils/snowflake.py +0 -0
  107. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/utils/str_util.py +0 -0
  108. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi/utils/swagger_to_js.py +0 -0
  109. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi.egg-info/SOURCES.txt +0 -0
  110. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  111. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/fastgenerateapi.egg-info/top_level.txt +0 -0
  112. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/script/__init__.py +0 -0
  113. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/setup.cfg +0 -0
  114. {fastgenerateapi-1.1.12 → fastgenerateapi-1.1.14}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.1.12
3
+ Version: 1.1.14
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -24,15 +24,17 @@ License-File: LICENSE
24
24
  [Github](https://github.com/ShiLiangAPI)
25
25
 
26
26
  #### 版本说明
27
- 最新版本:v1.1.7
27
+ [pydantic-v2]
28
+ 稳定版本:v1.1.13+
28
29
  建议python版本:3.9+
29
- 推荐fastapi版本:0.103.2
30
- 推荐pydantic版本:2.11.5
30
+ 推荐fastapi版本:0.103.2+
31
+ 推荐pydantic版本:2.11.5+
31
32
 
33
+ [pydantic-v1]
32
34
  稳定版本:v0.0.21
33
35
  建议python版本:3.9+
34
36
  推荐fastapi版本:0.97.0
35
-
37
+ 推荐pydantic版本:1.10.9+
36
38
 
37
39
 
38
40
  ###### FastGenerateApi 使用说明
@@ -6,15 +6,17 @@
6
6
  [Github](https://github.com/ShiLiangAPI)
7
7
 
8
8
  #### 版本说明
9
- 最新版本:v1.1.7
9
+ [pydantic-v2]
10
+ 稳定版本:v1.1.13+
10
11
  建议python版本:3.9+
11
- 推荐fastapi版本:0.103.2
12
- 推荐pydantic版本:2.11.5
12
+ 推荐fastapi版本:0.103.2+
13
+ 推荐pydantic版本:2.11.5+
13
14
 
15
+ [pydantic-v1]
14
16
  稳定版本:v0.0.21
15
17
  建议python版本:3.9+
16
18
  推荐fastapi版本:0.97.0
17
-
19
+ 推荐pydantic版本:1.10.9+
18
20
 
19
21
 
20
22
  ###### FastGenerateApi 使用说明
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (1, 1, 12)
11
+ VERSION = (1, 1, 14)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -63,12 +63,10 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
63
63
  if not self.model_class:
64
64
  return self.error(msg="model_class not allow None")
65
65
  model_class = self.model_class
66
- delete_filter_field = settings.app_settings.WHETHER_DELETE_FIELD
66
+ delete_filter_dict = {settings.app_settings.WHETHER_DELETE_FIELD: True}
67
67
  if settings.app_settings.DELETE_FIELD_TYPE == "time":
68
- delete_filter_field = f"{settings.app_settings.WHETHER_DELETE_FIELD}__isnull"
69
- queryset = model_class.filter(**{
70
- delete_filter_field: True
71
- })
68
+ delete_filter_dict = {settings.app_settings.WHETHER_DELETE_FIELD: 0}
69
+ queryset = model_class.filter(**delete_filter_dict)
72
70
 
73
71
  return queryset
74
72
 
@@ -170,7 +168,7 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
170
168
  if model and getattr(request_data, unique_field) == getattr(model, unique_field):
171
169
  continue
172
170
  if await model_class.filter(**{unique_field: getattr(request_data, unique_field)}).first():
173
- self.fail(message=f"{self.get_field_description(model_class, unique_field)}已存在相同值:{getattr(request_data, unique_field)}")
171
+ self.fail(msg=f"{self.get_field_description(model_class, unique_field)}已存在相同值:{getattr(request_data, unique_field)}")
174
172
  for unique_together_fields in check_unique_together_fields:
175
173
  filter_fields = {}
176
174
  is_equal = True
@@ -193,8 +191,10 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
193
191
  continue
194
192
 
195
193
  if await model_class.filter(**filter_fields).first():
196
- self.fail(
197
- message=f"{self.get_field_description(model_class, description_fields)}已存在相同值:{[filter_fields.get(field) for field in description_fields]}"
194
+ if settings.app_settings.WHETHER_DELETE_FIELD in description_fields:
195
+ description_fields.remove(settings.app_settings.WHETHER_DELETE_FIELD)
196
+ return self.error(
197
+ msg=f"{self.get_field_description(model_class, description_fields)}已存在相同值:{[filter_fields.get(field) for field in description_fields]}"
198
198
  )
199
199
 
200
200
  # @staticmethod
@@ -143,7 +143,7 @@ class GetAllView(BaseView, GetMixin):
143
143
  key_builder=generate_key_builder))
144
144
  async def route(
145
145
  request: Request,
146
- paginator=Depends(paginator_deps()),
146
+ paginator = Depends(paginator_deps()),
147
147
  search: Optional[str] = Depends(search_params_deps(self.search_fields)),
148
148
  filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields, schema=self.filter_schema)),
149
149
  token: Optional[str] = Depends(OAuth2PasswordBearer(tokenUrl="token", auto_error=False)),
@@ -189,7 +189,7 @@ class GetRelationView(BaseView):
189
189
  self.get_relation_response_schema = response_factory(self.get_relation_page_schema, name="GetPage")
190
190
  doc = self.get_relation.__doc__
191
191
  summary = doc.strip().split("\n")[0] if doc else f"Get {self.model_class.__name__.title()}"
192
- path = f"/get-{self.relation_id_name.strip('_id')}-by-{self.path_id_name.strip('_id')}/{'{pk}'}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
192
+ path = f"/get-{self.relation_id_name.removesuffix('_id')}-by-{self.path_id_name.removesuffix('_id')}/{'{pk}'}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else ""
193
193
  self._add_api_route(
194
194
  path=path,
195
195
  endpoint=self._get_relation_decorator(),
@@ -29,7 +29,7 @@ class DBModelMixin:
29
29
  if type(fields) == str:
30
30
  try:
31
31
  field_info = model_class._meta.fields_map.get(fields)
32
- field_info_fk = model_class._meta.fields_map.get(fields.rstrip("_id"))
32
+ field_info_fk = model_class._meta.fields_map.get(fields.removesuffix("_id"))
33
33
  if field_info:
34
34
  return field_info.description or ""
35
35
  elif fields.endswith("_id") and field_info_fk:
@@ -75,7 +75,7 @@ class UpdateRelationView(BaseView, SaveMixin):
75
75
  self.update_relation_response_schema = response_factory(name="UpdateRelation")
76
76
  doc = self.update_relation.__doc__
77
77
  summary = doc.strip().split("\n")[0] if doc else f"Update {self.model_class.__name__.title()}"
78
- path = f"/update-{self.relation_id_name.strip('_id')}-by-{self.path_id_name.strip('_id')}/{'{pk}'}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else "/{pk}"
78
+ path = f"/update-{self.relation_id_name.removesuffix('_id')}-by-{self.path_id_name.removesuffix('_id')}/{'{pk}'}" if settings.app_settings.ROUTER_WHETHER_ADD_SUFFIX else "/{pk}"
79
79
  self._add_api_route(
80
80
  path=path,
81
81
  endpoint=self._update_relation_decorator(),
@@ -69,17 +69,14 @@ class BaseFilter:
69
69
  for f in filter_str[1:]:
70
70
  if type(f) == type:
71
71
  field_type = f
72
- continue
73
- if type(f) == str:
72
+ elif type(f) == str:
74
73
  filter_field = f
75
- continue
76
- if callable(f):
74
+ elif callable(f):
77
75
  filter_func = f
78
76
  if not filter_field:
79
- if settings.app_settings.FILTER_UNDERLINE_WHETHER_DOUBLE_TO_SINGLE:
80
- filter_field = model_field.replace("__", "_")
81
- else:
82
- filter_field = model_field
77
+ filter_field = model_field
78
+ if settings.app_settings.FILTER_UNDERLINE_WHETHER_DOUBLE_TO_SINGLE:
79
+ filter_field = filter_field.replace("__", "_")
83
80
 
84
81
  self.field_type = field_type
85
82
  self.model_field = model_field
@@ -37,7 +37,7 @@ class RPCController(ResponseMixin):
37
37
  for response_param_value in request_param_value_list:
38
38
  if type(response_param_value) == str:
39
39
  response_field_name = response_param_value
40
- response_field_alias_name = model_field.rstrip("_id") + "_" + response_param_value
40
+ response_field_alias_name = model_field.removesuffix("_id") + "_" + response_param_value
41
41
  elif type(response_param_value) == tuple and len(response_param_value) > 1:
42
42
  response_field_name = response_param_value[0]
43
43
  response_field_alias_name = response_param_value[1]
@@ -5,6 +5,7 @@ from pydantic import create_model
5
5
  from pydantic.fields import FieldInfo
6
6
 
7
7
  from fastgenerateapi.pydantic_utils.base_model import BaseModel, model_config
8
+ from fastgenerateapi.schemas_factory.common_function import get_validate_dict
8
9
  from fastgenerateapi.settings.all_settings import settings
9
10
  from fastgenerateapi.utils.str_util import parse_str_to_int, parse_str_to_bool
10
11
 
@@ -42,7 +43,12 @@ def paginator_deps():
42
43
  FieldInfo(default=Query(settings.app_settings.DEFAULT_WHETHER_PAGE), title="是否分页", description="是否分页")
43
44
  ),
44
45
  }
45
- pagination_model: Type[BaseModel] = create_model("paginator", **fields, __config__=model_config)
46
+ pagination_model: Type[BaseModel] = create_model(
47
+ "paginator",
48
+ **fields,
49
+ __config__=model_config,
50
+ __validators__=get_validate_dict(),
51
+ )
46
52
 
47
53
  def pagination_deps(paginator: pagination_model = Depends(pagination_model)) -> pagination_model:
48
54
  current_page_value = parse_str_to_int(getattr(paginator, settings.app_settings.CURRENT_PAGE_FIELD))
@@ -5,6 +5,7 @@ from pydantic.fields import FieldInfo
5
5
 
6
6
  from fastgenerateapi.pydantic_utils.base_model import model_config
7
7
  from fastgenerateapi.pydantic_utils.base_model import ModelConfig
8
+ from fastgenerateapi.schemas_factory.common_function import get_validate_dict
8
9
  from fastgenerateapi.settings.all_settings import settings
9
10
 
10
11
  from pydantic import BaseModel, create_model
@@ -26,7 +27,12 @@ def tree_params_deps():
26
27
  )
27
28
  }
28
29
 
29
- filter_tree_params_model: Type[BaseModel] = create_model("TreeFilterParams", __config__=model_config, **model_fields)
30
+ filter_tree_params_model: Type[BaseModel] = create_model(
31
+ "TreeFilterParams",
32
+ **model_fields,
33
+ __config__=model_config,
34
+ __validators__=get_validate_dict(),
35
+ )
30
36
 
31
37
  def filter_query(filter_params: filter_tree_params_model = Depends(filter_tree_params_model)) -> Optional[str]:
32
38
  """
@@ -6,6 +6,7 @@ import fastapi
6
6
  from fastapi import params
7
7
  from fastapi.dependencies.models import Dependant
8
8
  from fastapi.dependencies.utils import get_sub_dependant
9
+ from pydantic.alias_generators import to_snake, to_camel
9
10
 
10
11
 
11
12
  def get_param_sub_dependant(
@@ -25,10 +26,16 @@ def get_param_sub_dependant(
25
26
  )
26
27
  for query_param in dependant.query_params:
27
28
  query_param_field = depends.dependency.model_fields.get(query_param.name)
29
+ if not query_param_field:
30
+ snake_name = to_snake(query_param.name)
31
+ if query_param.name != snake_name:
32
+ query_param_field = depends.dependency.model_fields.get(snake_name)
33
+ if not query_param_field:
34
+ camel_name = to_camel(query_param.name)
35
+ if query_param.name != camel_name:
36
+ query_param_field = depends.dependency.model_fields.get(camel_name)
28
37
  if query_param_field:
29
38
  query_param.field_info.description = query_param_field.description or query_param_field.title or ""
30
- else:
31
- query_param.field_info.description = query_param_field.description or query_param_field.title or ""
32
39
  return dependant
33
40
 
34
41
 
@@ -33,6 +33,8 @@ class BaseDeleteMixin(models.Model):
33
33
 
34
34
  class Meta:
35
35
  abstract = True
36
+ # 常用于联合索引
37
+ # unique_together = (("field_xxx", "deleted_at"),)
36
38
 
37
39
 
38
40
  class BaseActiveMixin(models.Model):
@@ -27,8 +27,8 @@ class SoftDeleteField(BigIntField):
27
27
 
28
28
  def __init__(self, **kwargs: Any) -> None:
29
29
  kwargs.setdefault("index", True)
30
- kwargs.setdefault("null", True)
31
- kwargs.setdefault("default", None)
30
+ kwargs.setdefault("null", False)
31
+ kwargs.setdefault("default", 0)
32
32
  kwargs.setdefault("description", "软删除")
33
33
  super().__init__(**kwargs)
34
34
 
@@ -1,7 +1,7 @@
1
1
  import importlib
2
- from typing import List, Optional
2
+ from typing import List, Optional, Any
3
3
 
4
- from pydantic import BaseModel as PydanticBaseModel, BaseConfig, Field, ConfigDict
4
+ from pydantic import BaseModel as PydanticBaseModel, BaseConfig, Field, ConfigDict, field_validator
5
5
 
6
6
  from fastgenerateapi.pydantic_utils.json_encoders import JSON_ENCODERS
7
7
  from fastgenerateapi.settings.all_settings import settings
@@ -54,6 +54,13 @@ model_config = ConfigDict(
54
54
  class BaseModel(PydanticBaseModel):
55
55
  model_config = model_config
56
56
 
57
+ @field_validator('*', mode='before') # '*' 表示匹配所有字段
58
+ def empty_str_to_none(cls, v: Any) -> Any:
59
+ """将空字符串转换为None,其他值保持不变"""
60
+ if isinstance(v, str) and v.strip() == "": # 处理纯空字符串或仅含空格的字符串
61
+ return None
62
+ return v
63
+
57
64
 
58
65
  class IdList(BaseModel):
59
66
  id_list: List[str] = Field([], description="id数组")
@@ -1,6 +1,6 @@
1
1
  from typing import Type, Optional, Union
2
2
 
3
- from pydantic import validator
3
+ from pydantic import validator, field_validator
4
4
  from pydantic.fields import FieldInfo
5
5
  from tortoise import Model
6
6
 
@@ -111,13 +111,25 @@ def get_dict_from_pydanticmeta(model_class: Type[Model], data: Union[list, tuple
111
111
  return fields_info
112
112
 
113
113
 
114
+ def get_validate_dict() -> dict:
115
+
116
+ def empty_str_to_none(v, values):
117
+ if isinstance(v, str) and v.strip() == "":
118
+ return None
119
+ return v
120
+
121
+ validator_dict = {
122
+ "empty_str_to_none": field_validator('*', mode='before')(empty_str_to_none)
123
+ }
124
+
125
+ return validator_dict
126
+
127
+
114
128
  def get_validate_dict_from_fields(fields_info: dict) -> dict:
115
129
  validator_dict = {}
116
130
 
117
131
  def remove_blank_strings(v, values):
118
- if isinstance(v, str):
119
- v = v.strip()
120
- if v == "":
132
+ if isinstance(v, str) and v.strip() == "":
121
133
  return None
122
134
  return v
123
135
 
@@ -129,3 +141,5 @@ def get_validate_dict_from_fields(fields_info: dict) -> dict:
129
141
  return validator_dict
130
142
 
131
143
 
144
+
145
+
@@ -1,4 +1,4 @@
1
- from typing import Type, Union
1
+ from typing import Type, Union, Optional
2
2
 
3
3
  from fastapi import Query
4
4
  from pydantic import BaseModel, create_model
@@ -9,6 +9,8 @@ from fastgenerateapi.api_view.mixin.dbmodel_mixin import DBModelMixin
9
9
  from fastgenerateapi.controller.filter_controller import BaseFilter
10
10
  from tortoise import Model
11
11
 
12
+ from fastgenerateapi.schemas_factory.common_function import get_validate_dict
13
+
12
14
 
13
15
  def filter_schema_factory(model_class: Type[Model], fields: list[str, tuple[str, Type], BaseFilter] = None):
14
16
  """
@@ -24,7 +26,7 @@ def filter_schema_factory(model_class: Type[Model], fields: list[str, tuple[str,
24
26
  description = DBModelMixin.get_field_description(model_class, field_info.model_field)
25
27
  model_fields.update({
26
28
  f: (
27
- Union[t, str],
29
+ Optional[t],
28
30
  FieldInfo(
29
31
  title=f"{description}",
30
32
  default=Query("", description=description),
@@ -35,7 +37,8 @@ def filter_schema_factory(model_class: Type[Model], fields: list[str, tuple[str,
35
37
  filter_params_model: Type[BaseModel] = create_model(
36
38
  model_class.__name__+"CommonFilterParams",
37
39
  **model_fields,
38
- __config__=model_config
40
+ __config__=model_config,
41
+ __validators__=get_validate_dict(),
39
42
  )
40
43
 
41
44
  return filter_params_model
@@ -7,7 +7,7 @@ from fastgenerateapi.pydantic_utils.base_settings import BaseSettings
7
7
 
8
8
 
9
9
  class AppSettings(BaseSettings):
10
- # 字段配置 老版本(pydantic.utils.to_lower_camel)
10
+ # 字段配置 驼峰格式:新版本(pydantic.alias_generators:to_camel)、老版本(pydantic.utils.to_lower_camel)
11
11
  ALIAS_GENERATOR: Optional[str] = Field(default="pydantic.alias_generators.to_snake", description="序列化参数命名方法路径")
12
12
 
13
13
  # 分页对应字段以及配置默认值
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.1.12
3
+ Version: 1.1.14
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -24,15 +24,17 @@ License-File: LICENSE
24
24
  [Github](https://github.com/ShiLiangAPI)
25
25
 
26
26
  #### 版本说明
27
- 最新版本:v1.1.7
27
+ [pydantic-v2]
28
+ 稳定版本:v1.1.13+
28
29
  建议python版本:3.9+
29
- 推荐fastapi版本:0.103.2
30
- 推荐pydantic版本:2.11.5
30
+ 推荐fastapi版本:0.103.2+
31
+ 推荐pydantic版本:2.11.5+
31
32
 
33
+ [pydantic-v1]
32
34
  稳定版本:v0.0.21
33
35
  建议python版本:3.9+
34
36
  推荐fastapi版本:0.97.0
35
-
37
+ 推荐pydantic版本:1.10.9+
36
38
 
37
39
 
38
40
  ###### FastGenerateApi 使用说明