fastgenerateapi 1.1.27__tar.gz → 1.2.1__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 (116) hide show
  1. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/PKG-INFO +2 -12
  2. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/README.md +1 -11
  3. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/__init__.py +1 -1
  4. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/__version__.py +1 -1
  5. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/base_view.py +23 -11
  6. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/create_view.py +26 -19
  7. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/get_one_view.py +2 -1
  8. fastgenerateapi-1.2.1/fastgenerateapi/api_view/mixin/save_mixin.py +16 -0
  9. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/switch_view.py +3 -8
  10. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/update_view.py +27 -17
  11. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/common_function.py +2 -0
  12. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/create_schema_factory.py +39 -0
  13. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +42 -0
  14. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +39 -0
  15. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/update_schema_factory.py +39 -0
  16. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/app_settings.py +3 -0
  17. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi.egg-info/PKG-INFO +2 -12
  18. fastgenerateapi-1.1.27/fastgenerateapi/api_view/mixin/save_mixin.py +0 -14
  19. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/LICENSE +0 -0
  20. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/__init__.py +0 -0
  21. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/api_view.py +0 -0
  22. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/delete_filter_view.py +0 -0
  23. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/delete_tree_view.py +0 -0
  24. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/delete_view.py +0 -0
  25. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/get_all_view.py +0 -0
  26. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/get_relation_view.py +0 -0
  27. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/get_tree_view.py +0 -0
  28. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  29. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/base_mixin.py +0 -0
  30. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +0 -0
  31. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
  32. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
  33. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
  34. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
  35. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/utils/docx_util.py +0 -0
  36. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/utils/file_util.py +0 -0
  37. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/utils/pdf_util.py +0 -0
  38. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +0 -0
  39. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/mixin/utils/zip_util.py +0 -0
  40. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/sql_get_view.py +0 -0
  41. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/api_view/update_relation_view.py +0 -0
  42. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/cache/__init__.py +0 -0
  43. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/cache/cache_decorator.py +0 -0
  44. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/cache/key_builder.py +0 -0
  45. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/channel/__init__.py +0 -0
  46. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/channel/connection_manager.py +0 -0
  47. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/channel/consumer.py +0 -0
  48. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/channel/websocket_view.py +0 -0
  49. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/controller/__init__.py +0 -0
  50. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/controller/filter_controller.py +0 -0
  51. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/controller/router_controller.py +0 -0
  52. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/controller/rpc_controller.py +0 -0
  53. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/controller/search_controller.py +0 -0
  54. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/controller/ws_controller.py +0 -0
  55. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/data_type/__init__.py +0 -0
  56. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/data_type/data_type.py +0 -0
  57. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  58. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/deps/__init__.py +0 -0
  59. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/deps/filter_params_deps.py +0 -0
  60. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/deps/paginator_deps.py +0 -0
  61. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/deps/tree_params_deps.py +0 -0
  62. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/example/__init__.py +0 -0
  63. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/example/models.py +0 -0
  64. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/example/routers.py +0 -0
  65. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/example/schemas.py +0 -0
  66. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/example/views.py +0 -0
  67. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
  68. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/fastapi_utils/all.py +0 -0
  69. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
  70. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
  71. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/model/__init__.py +0 -0
  72. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/model/base_model.py +0 -0
  73. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/my_fields/__init__.py +0 -0
  74. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/my_fields/aes_field.py +0 -0
  75. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/my_fields/enum_field.py +0 -0
  76. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/my_fields/pk_field.py +0 -0
  77. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  78. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
  79. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/my_fields/validator.py +0 -0
  80. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  81. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/pydantic_utils/base_model.py +0 -0
  82. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
  83. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
  84. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  85. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
  86. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/filter_schema_factory.py +0 -0
  87. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
  88. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
  89. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
  90. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
  91. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/__init__.py +0 -0
  92. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/all_settings.py +0 -0
  93. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/db_settings.py +0 -0
  94. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/etcd_settings.py +0 -0
  95. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/file_settings.py +0 -0
  96. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/jwt_settings.py +0 -0
  97. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/otlp_settings.py +0 -0
  98. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/redis_settings.py +0 -0
  99. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/sms_settings.py +0 -0
  100. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/settings/system_settings.py +0 -0
  101. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/utils/__init__.py +0 -0
  102. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/utils/aes.py +0 -0
  103. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/utils/auto_discover.py +0 -0
  104. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/utils/exception.py +0 -0
  105. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/utils/file_utils.py +0 -0
  106. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/utils/pwd_utils.py +0 -0
  107. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/utils/ramdom_utils.py +0 -0
  108. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/utils/snowflake.py +0 -0
  109. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/utils/str_util.py +0 -0
  110. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi/utils/swagger_to_js.py +0 -0
  111. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi.egg-info/SOURCES.txt +0 -0
  112. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  113. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/fastgenerateapi.egg-info/top_level.txt +0 -0
  114. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/script/__init__.py +0 -0
  115. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/setup.cfg +0 -0
  116. {fastgenerateapi-1.1.27 → fastgenerateapi-1.2.1}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.1.27
3
+ Version: 1.2.1
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -25,7 +25,7 @@ License-File: LICENSE
25
25
 
26
26
  #### 版本说明
27
27
  [pydantic-v2]
28
- 稳定版本:v1.1.15+
28
+ 稳定版本:v1.1.29+
29
29
  建议python版本:3.9+
30
30
  推荐fastapi版本:0.103.2+
31
31
  推荐pydantic版本:2.11.5+
@@ -107,16 +107,6 @@ class XxxView(APIView):
107
107
  model_class = XxxModel
108
108
  ```
109
109
 
110
- #### 继承 APIView 使用,关闭其中部分路由示例
111
- ```python
112
- from core.crud.api_view import APIView
113
-
114
- class XxxView(APIView):
115
- create_route = False
116
- get_one_route = False
117
- update_route = False
118
- delete_route = False
119
- ```
120
110
  #### 查询/创建/修改字段限制及校验示例
121
111
  - 如果有唯一字段或者联合唯一字段自动校验是否为唯一值
122
112
  ```python
@@ -7,7 +7,7 @@
7
7
 
8
8
  #### 版本说明
9
9
  [pydantic-v2]
10
- 稳定版本:v1.1.15+
10
+ 稳定版本:v1.1.29+
11
11
  建议python版本:3.9+
12
12
  推荐fastapi版本:0.103.2+
13
13
  推荐pydantic版本:2.11.5+
@@ -89,16 +89,6 @@ class XxxView(APIView):
89
89
  model_class = XxxModel
90
90
  ```
91
91
 
92
- #### 继承 APIView 使用,关闭其中部分路由示例
93
- ```python
94
- from core.crud.api_view import APIView
95
-
96
- class XxxView(APIView):
97
- create_route = False
98
- get_one_route = False
99
- update_route = False
100
- delete_route = False
101
- ```
102
92
  #### 查询/创建/修改字段限制及校验示例
103
93
  - 如果有唯一字段或者联合唯一字段自动校验是否为唯一值
104
94
  ```python
@@ -7,7 +7,7 @@
7
7
  # .88
8
8
  # d8888P
9
9
 
10
-
10
+ author="石亮"
11
11
  from fastgenerateapi.api_view.api_view import APIView, CreateView, GetOneView, GetAllView, UpdateView, DeleteView, \
12
12
  SwitchView
13
13
  from fastgenerateapi.api_view.get_tree_view import GetTreeView
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (1, 1, 27)
11
+ VERSION = (1, 2, 1)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -25,6 +25,7 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
25
25
  prefix: Optional[str] = None # 路由追加后缀
26
26
  model_class: Optional[Type[Model]] = None # 数据库模型
27
27
  prefetch_related_fields: Union[None, dict] = None
28
+ is_with_prefetch: Optional[bool] = False
28
29
  schema: Optional[Type[BaseModel]] = None # 返回序列化[未使用]
29
30
  dependencies: Optional[Sequence[params.Depends]] = None
30
31
  tags: Optional[List[str]] = None # swagger标签
@@ -36,6 +37,7 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
36
37
  "avatar": None, # 外键内容对应字典的形式
37
38
  "avatar": ["id", ("url", "avatar_url")] # 增加 avatar_id,avatar_url2个字段
38
39
  }
40
+ is_with_prefetch: 是否带有列表的prefetch_related_fields
39
41
 
40
42
  # router_args: List[Union[str, tuple, BaseRouterSummary]] = None
41
43
  # 给函数设置路由以及其他参数
@@ -158,36 +160,46 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
158
160
  @classmethod
159
161
  async def check_unique_field(
160
162
  cls,
161
- request_data: Union[BaseModel, Model], # 创建或修改的参数数据
162
- model_class: Type[Model], # 数据库模型
163
+ data_dict: dict,
164
+ model_class: Type[Model],
163
165
  model: Union[Model, None] = None
164
166
  ):
167
+ """
168
+ 校验模型中设置了 唯一索引和联合唯一索引 的字段
169
+ :param data_dict: 修改或创建的数据字典
170
+ :param model_class: 数据库模型
171
+ :param model: 修改前的数据,用于判断是否修改了字段,当唯一字段与数据data_dict一致时,不会做校验
172
+ :return:
173
+ """
165
174
  check_unique_fields = cls._get_unique_fields(model_class)
166
175
  check_unique_together_fields = cls._get_unique_together_fields(model_class)
167
176
  for unique_field in check_unique_fields:
168
- if hasattr(request_data, unique_field):
169
- if model and getattr(request_data, unique_field) == getattr(model, unique_field):
177
+ if unique_field in data_dict:
178
+ unique_field_value = data_dict.get(unique_field)
179
+ if model and unique_field_value == getattr(model, unique_field):
170
180
  continue
171
- if await model_class.filter(**{unique_field: getattr(request_data, unique_field)}).first():
172
- return cls.error(msg=f"{cls.get_field_description(model_class, unique_field)}已存在相同值:{getattr(request_data, unique_field)}")
181
+ if await model_class.filter(**{unique_field: unique_field_value}).first():
182
+ return cls.error(msg=f"{cls.get_field_description(model_class, unique_field)}已存在相同值:{unique_field_value}")
173
183
  for unique_together_fields in check_unique_together_fields:
174
184
  filter_fields = {}
175
185
  is_equal = True
176
186
  description_fields = []
177
187
  for unique_together_field in unique_together_fields:
188
+ has_unique_together_field = unique_together_field in data_dict
189
+ unique_together_field_value = data_dict.get(unique_together_field)
178
190
  if model:
179
- if hasattr(request_data, unique_together_field):
180
- filter_fields[unique_together_field] = getattr(request_data, unique_together_field)
181
- if getattr(request_data, unique_together_field, None) != getattr(model, unique_together_field):
191
+ if has_unique_together_field:
192
+ filter_fields[unique_together_field] = unique_together_field_value
193
+ if unique_together_field_value != getattr(model, unique_together_field):
182
194
  is_equal = False
183
195
  description_fields.append(unique_together_field)
184
196
  else:
185
197
  filter_fields[unique_together_field] = getattr(model, unique_together_field)
186
198
  else:
187
- if hasattr(request_data, unique_together_field):
199
+ if has_unique_together_field:
188
200
  is_equal = False
189
201
  description_fields.append(unique_together_field)
190
- filter_fields[unique_together_field] = getattr(request_data, unique_together_field)
202
+ filter_fields[unique_together_field] = unique_together_field_value
191
203
  if is_equal:
192
204
  continue
193
205
 
@@ -36,43 +36,50 @@ class CreateView(BaseView, SaveMixin):
36
36
  @atomic()
37
37
  async def create(self, request_data, *args, **kwargs):
38
38
  try:
39
- model = await self.set_create_fields(request_data=request_data, *args, **kwargs)
39
+ data_dict = await self.set_create_fields(request_data=request_data, *args, **kwargs)
40
+ data_dict = await self.set_save_fields(data_dict, request_data=request_data, *args, **kwargs)
41
+ model = await self.set_create_model(data_dict, request_data=request_data, *args, **kwargs)
40
42
  except ValueError as e:
41
43
  error_field = str(e).split(" ")[0]
42
44
  if getattr(request_data, error_field):
43
45
  return self.error(msg=f"{self.get_field_description(self.model_class, error_field)}格式不正确")
44
46
  return self.error(msg=f"{self.get_field_description(self.model_class, error_field)}不能为空")
45
47
 
46
- model = await self.set_save_model(model=model, request_data=request_data, *args, **kwargs)
47
-
48
- model = await self.set_create_model(model=model, request_data=request_data, *args, **kwargs)
49
-
50
- await self.check_unique_field(model, model_class=self.model_class)
51
-
48
+ await self.check_unique_field(data_dict, model_class=self.model_class)
52
49
  await model.save()
53
50
 
54
- model = await self.model_class.filter(id=model.id).prefetch_related(
55
- *self.prefetch_related_fields.keys()).first()
56
-
57
- await self.setattr_model(model, prefetch_related_fields=self.prefetch_related_fields)
51
+ if settings.app_settings.WHETHER_CREATE_RESPONSE_DATA:
52
+ if self.is_with_prefetch:
53
+ model = await self.get_object(model.id, self.model_class, self.is_with_prefetch)
54
+ await self.setattr_model(model, prefetch_related_fields=self.prefetch_related_fields)
58
55
 
59
- # await self.setattr_model_rpc(self.rpc_class, model, self.rpc_param)
56
+ return self.create_response_schema.model_validate(model)
60
57
 
61
- return self.get_one_schema.from_orm(model)
58
+ return
62
59
 
63
- async def set_create_fields(self, request_data, *args, **kwargs):
60
+ async def set_create_fields(self, request_data, *args, **kwargs) -> dict:
64
61
  """
65
- 添加属性: request_data.user_id = request.user.id
62
+ 添加属性:
63
+ data_dict = request_data.dict(exclude_unset=True)
64
+ data_dict.update({
65
+ "user_id": request.user.id,
66
+ })
67
+ return data_dict
66
68
  """
67
69
 
68
- return self.model_class(**request_data.dict(exclude_unset=True))
70
+ return request_data.dict(exclude_unset=True)
69
71
 
70
- async def set_create_model(self, model: Model, request_data, *args, **kwargs) -> Model:
72
+ async def set_create_model(self, data_dict: dict, request_data, *args, **kwargs) -> Model:
71
73
  """
72
- 添加属性: model.user_id = request.user.id
74
+ 在数据模型校验前后修改值
75
+ - 可用于全局修改
76
+ 添加属性:
77
+ data_dict.update({
78
+ "user_id": request.user.id,
79
+ })
73
80
  """
74
81
 
75
- return model
82
+ return self.model_class(**data_dict)
76
83
 
77
84
  def _create_decorator(self, *args: Any, **kwargs: Any) -> DecoratedCallable:
78
85
  async def route(
@@ -25,7 +25,6 @@ class GetOneView(BaseView, GetMixin):
25
25
 
26
26
  get_one_route: Union[bool, DEPENDENCIES] = True
27
27
  get_one_schema: Optional[Type[BaseModel]] = None
28
- is_with_prefetch: Optional[bool] = False
29
28
  """
30
29
  get_one_route: 获取详情路由开关,可以放依赖函数列表
31
30
  get_one_schema: 返回序列化
@@ -35,6 +34,8 @@ class GetOneView(BaseView, GetMixin):
35
34
  - 优选模型层get_one_include和get_one_exclude(同时存在交集)
36
35
  - 合并模型层include和exclude(同时存在交集)
37
36
  - 模型层所有字段
37
+
38
+ prefetch_related_fields:额外展示字段
38
39
  is_with_prefetch: 是否带有列表的prefetch_related_fields
39
40
  """
40
41
 
@@ -0,0 +1,16 @@
1
+ from tortoise import Model
2
+
3
+ from fastgenerateapi.pydantic_utils.base_model import BaseModel
4
+
5
+
6
+ class SaveMixin:
7
+
8
+ async def set_save_fields(self, data_dict: dict, *args, **kwargs) -> dict:
9
+ """
10
+ 添加属性: data_dict['user_id'] = current_user.id
11
+ kwargs 包含 request_data
12
+ """
13
+
14
+ return data_dict
15
+
16
+
@@ -28,21 +28,16 @@ class SwitchView(BaseView):
28
28
  except Exception:
29
29
  request_data = {}
30
30
 
31
- model = await self.queryset.filter(id=pk).first()
32
- if not model:
33
- raise NOT_FOUND
34
-
31
+ model = await self.get_object(pk, self.model_class, is_with_prefetch=self.is_with_prefetch)
35
32
  setattr(
36
33
  model,
37
34
  filed,
38
35
  not getattr(model, filed) if request_data.get(filed) is None else request_data.get(filed)
39
36
  )
40
-
41
37
  await model.save()
42
38
 
43
- await self.setattr_model(model, prefetch_related_fields=self.prefetch_related_fields)
44
-
45
- # await self.setattr_model_rpc(self.rpc_class, model, self.rpc_param)
39
+ if self.is_with_prefetch:
40
+ await self.setattr_model(model, prefetch_related_fields=self.prefetch_related_fields)
46
41
 
47
42
  return self.get_one_schema.from_orm(model)
48
43
 
@@ -31,36 +31,46 @@ class UpdateView(BaseView, SaveMixin):
31
31
 
32
32
  @atomic()
33
33
  async def update(self, pk: str, request_data, *args, **kwargs):
34
- model = await self.get_object(pk, self.model_class)
35
-
36
- request_data = await self.set_update_fields(request_data=request_data, *args, **kwargs)
37
-
38
- await self.check_unique_field(request_data, model_class=self.model_class, model=model)
39
-
40
- model = await self.set_save_model(model=model, request_data=request_data, *args, **kwargs)
41
-
42
- model = await self.set_update_model(model=model, request_data=request_data, *args, **kwargs)
34
+ model = await self.get_object(pk, self.model_class, self.is_with_prefetch)
35
+ data_dict = await self.set_update_fields(request_data=request_data, *args, **kwargs)
36
+ data_dict = await self.set_save_fields(data_dict, request_data=request_data, *args, **kwargs)
43
37
 
38
+ await self.check_unique_field(data_dict, model_class=self.model_class, model=model)
39
+ model = await self.set_update_model(model, data_dict, request_data=request_data, *args, **kwargs)
44
40
  await model.save()
45
41
 
46
- await self.setattr_model(model, prefetch_related_fields=self.prefetch_related_fields, *args, **kwargs)
42
+ if settings.app_settings.WHETHER_UPDATE_RESPONSE_DATA:
43
+ if self.is_with_prefetch:
44
+ await self.setattr_model(model, prefetch_related_fields=self.prefetch_related_fields, *args, **kwargs)
47
45
 
48
- # await self.setattr_model_rpc(self.rpc_class, model, self.rpc_param)
46
+ return self.update_response_schema.from_orm(model)
49
47
 
50
- return self.get_one_schema.from_orm(model)
48
+ return
51
49
 
52
50
  @staticmethod
53
51
  async def set_update_fields(request_data, *args, **kwargs):
54
52
  """
55
- 修改属性: request_data.user_id = request.user.id
53
+ 修改属性:
54
+ data_dict = request_data.dict(exclude_unset=True)
55
+ data_dict.update({
56
+ "user_id": request.user.id,
57
+ })
58
+ return data_dict
56
59
  """
57
- return request_data
58
60
 
59
- async def set_update_model(self, model: Model, request_data, *args, **kwargs) -> Model:
61
+ return request_data.dict(exclude_unset=True)
62
+
63
+ async def set_update_model(self, model: Model, data_dict: dict, *args, **kwargs) -> Model:
60
64
  """
61
- 修改属性: model.user_id = request.user.id
65
+ 在数据模型校验前后修改值:
66
+ - 【不常使用】:这里修改将不做唯一字段校验
67
+ - 可用于全局修改
68
+ data_dict.update({
69
+ "user_id": request.user.id,
70
+ })
62
71
  """
63
- return model.update_from_dict(request_data.dict(exclude_unset=True))
72
+
73
+ return model.update_from_dict(data_dict)
64
74
 
65
75
  def _update_decorator(self, *args: Any, **kwargs: Any) -> DecoratedCallable:
66
76
  async def route(
@@ -95,6 +95,8 @@ def get_dict_from_pydanticmeta(model_class: Type[Model], data: Union[list, tuple
95
95
  if len(field) == 2:
96
96
  if isinstance(field[1], str):
97
97
  key_field = field[1]
98
+ if isinstance(field[2], FieldInfo):
99
+ field_info = field[1]
98
100
  else:
99
101
  field_type = field[1]
100
102
  elif len(field) == 3:
@@ -21,6 +21,45 @@ def create_schema_factory(
21
21
  ) -> Type[T]:
22
22
  """
23
23
  Is used to create a CreateSchema
24
+ 固定排除 逻辑删除字段
25
+ 会默认添加模型下 PydanticMeta 设置的相关属性
26
+ - include: 增改详情列表通用,指定包含字段,不指定默认包含所有字段
27
+ - exclude: 增改详情列表通用,指定排除字段
28
+ - save_include: 增改通用,额外添加字段
29
+ - save_exclude: 增改通用,指定排除字段
30
+ - create_include: 增使用,额外添加字段
31
+ - create_exclude: 增使用,指定排除字段
32
+
33
+ 逻辑顺序:合并所有include和exclude,排除include下包含的exclude字段
34
+
35
+ 参数类型可选
36
+ - include类型:
37
+ - 字符串:【模型存在字段】自动生成,【模型不存在字段】默认字符串类型,无注释
38
+ - 2个值:
39
+ - (字符串, 类型int): 指定导出类型
40
+ - (字符串, FieldInfo()):
41
+ - (字符串1, 字符串2): 导出字段重命名。例如 ("name", "export_name")
42
+ - 3个值:
43
+ - (字符串1, 字符串2, 类型int):
44
+ - (字符串, 字符串2, FieldInfo()):
45
+ - (字符串, 类型int, FieldInfo()):
46
+ - 4个值:
47
+ - (字符串1, 字符串2, 类型int, FieldInfo()):
48
+ - exclude类型:仅字符串
49
+
50
+ 示例:
51
+ class model_class:
52
+ ...
53
+
54
+ PydanticMeta:
55
+ include = []
56
+ exclude = []
57
+ save_include = [
58
+ ("item_id_list", List[str], FieldInfo(description="多对多关联id列表")),
59
+ ]
60
+ save_exclude = ["ignore_field"]
61
+ create_include = ["create_user"]
62
+ create_exclude = []
24
63
  """
25
64
  all_fields_info = get_dict_from_model_fields(model_class)
26
65
 
@@ -27,6 +27,48 @@ def get_all_schema_factory(
27
27
  ) -> Optional[Type[T]]:
28
28
  """
29
29
  Is used to create a GetAllSchema
30
+ 固定排除 逻辑删除字段
31
+ 会默认添加模型下 PydanticMeta 设置的相关属性
32
+ - include: 增改详情列表通用,指定包含字段,不指定默认包含所有字段
33
+ - exclude: 增改详情列表通用,指定排除字段
34
+ - get_include: 详情列表通用,额外添加字段
35
+ - get_exclude: 详情列表通用,指定排除字段
36
+ - get_all_include: 详情使用,额外添加字段
37
+ - get_all_exclude: 详情使用,指定排除字段
38
+
39
+ 逻辑顺序:合并所有include和exclude,排除include下包含的exclude字段
40
+
41
+ 参数类型可选
42
+ - include类型:
43
+ - 字符串:【模型存在字段】自动生成,【模型不存在字段】默认字符串类型,无注释
44
+ - 2个值:
45
+ - (字符串, 类型int): 指定导出类型
46
+ - (字符串, FieldInfo()):
47
+ - (字符串1, 字符串2): 导出字段重命名。例如 ("name", "export_name")
48
+ - 3个值:
49
+ - (字符串1, 字符串2, 类型int):
50
+ - (字符串, 字符串2, FieldInfo()):
51
+ - (字符串, 类型int, FieldInfo()):
52
+ - 4个值:
53
+ - (字符串1, 字符串2, 类型int, FieldInfo()):
54
+ - exclude类型:仅字符串
55
+
56
+ 示例:
57
+ class model_class:
58
+ ...
59
+
60
+ PydanticMeta:
61
+ include = []
62
+ exclude = []
63
+ get_include = [
64
+ ("name", "export_name"),
65
+ ("item_id_list", List[str], FieldInfo(description="多对多关联id列表")),
66
+ ]
67
+ get_exclude = ["hide_field"]
68
+ get_all_include = [
69
+ ("item_names", str, FieldInfo(description="多对多关联名称集合"))
70
+ ]
71
+ get_all_exclude = []
30
72
  """
31
73
  all_fields_info = get_dict_from_model_fields(model_class)
32
74
 
@@ -20,6 +20,45 @@ def get_one_schema_factory(
20
20
  ) -> Type[T]:
21
21
  """
22
22
  Is used to create a GetOneSchema
23
+ 固定排除 逻辑删除字段
24
+ 会默认添加模型下 PydanticMeta 设置的相关属性
25
+ - include: 增改详情列表通用,指定包含字段,不指定默认包含所有字段
26
+ - exclude: 增改详情列表通用,指定排除字段
27
+ - get_include: 详情列表通用,额外添加字段
28
+ - get_exclude: 详情列表通用,指定排除字段
29
+ - get_one_include: 详情使用,额外添加字段
30
+ - get_one_exclude: 详情使用,指定排除字段
31
+
32
+ 逻辑顺序:合并所有include和exclude,排除include下包含的exclude字段
33
+
34
+ 参数类型可选
35
+ - include类型:
36
+ - 字符串:【模型存在字段】自动生成,【模型不存在字段】默认字符串类型,无注释
37
+ - 2个值:
38
+ - (字符串, 类型int): 指定导出类型
39
+ - (字符串, FieldInfo()):
40
+ - (字符串1, 字符串2): 导出字段重命名。例如 ("name", "export_name")
41
+ - 3个值:
42
+ - (字符串1, 字符串2, 类型int):
43
+ - (字符串, 字符串2, FieldInfo()):
44
+ - (字符串, 类型int, FieldInfo()):
45
+ - 4个值:
46
+ - (字符串1, 字符串2, 类型int, FieldInfo()):
47
+ - exclude类型:仅字符串
48
+
49
+ 示例:
50
+ class model_class:
51
+ ...
52
+
53
+ PydanticMeta:
54
+ include = []
55
+ exclude = []
56
+ get_include = [("name", "export_name")]
57
+ get_exclude = ["hide_field"]
58
+ get_one_include = [
59
+ ("item_id_list", List[str], FieldInfo(description="多对多关联id列表"))
60
+ ]
61
+ get_one_exclude = []
23
62
  """
24
63
  all_fields_info: dict = get_dict_from_model_fields(model_class)
25
64
 
@@ -21,6 +21,45 @@ def update_schema_factory(
21
21
  ) -> Type[T]:
22
22
  """
23
23
  Is used to create a UpdateSchema
24
+ 固定排除 逻辑删除字段
25
+ 会默认添加模型下 PydanticMeta 设置的相关属性
26
+ - include: 增改详情列表通用,指定包含字段,不指定默认包含所有字段
27
+ - exclude: 增改详情列表通用,指定排除字段
28
+ - save_include: 增改通用,额外添加字段
29
+ - save_exclude: 增改通用,指定排除字段
30
+ - update_include: 增使用,额外添加字段
31
+ - update_exclude: 增使用,指定排除字段
32
+
33
+ 逻辑顺序:合并所有include和exclude,排除include下包含的exclude字段
34
+
35
+ 参数类型可选
36
+ - include类型:
37
+ - 字符串:【模型存在字段】自动生成,【模型不存在字段】默认字符串类型,无注释
38
+ - 2个值:
39
+ - (字符串, 类型int): 指定导出类型
40
+ - (字符串, FieldInfo()):
41
+ - (字符串1, 字符串2): 导出字段重命名。例如 ("name", "export_name")
42
+ - 3个值:
43
+ - (字符串1, 字符串2, 类型int):
44
+ - (字符串, 字符串2, FieldInfo()):
45
+ - (字符串, 类型int, FieldInfo()):
46
+ - 4个值:
47
+ - (字符串1, 字符串2, 类型int, FieldInfo()):
48
+ - exclude类型:仅字符串
49
+
50
+ 示例:
51
+ class model_class:
52
+ ...
53
+
54
+ PydanticMeta:
55
+ include = []
56
+ exclude = []
57
+ save_include = [
58
+ ("item_id_list", List[str], FieldInfo(description="多对多关联id列表")),
59
+ ]
60
+ save_exclude = ["ignore_field"]
61
+ update_include = ["update_user"]
62
+ update_exclude = []
24
63
  """
25
64
  all_fields_info = get_dict_from_model_fields(model_class)
26
65
 
@@ -76,6 +76,9 @@ class AppSettings(BaseSettings):
76
76
  MESSAGE_RESPONSE_FIELD: Optional[str] = Field(default="msg", description="消息返回字段")
77
77
  DATA_RESPONSE_FIELD: Optional[str] = Field(default="data", description="数据返回字段")
78
78
  LIST_RESPONSE_FIELD: Optional[str] = Field(default="list", description="列表页返回字段")
79
+ # 创建和修改是否返回详情
80
+ WHETHER_CREATE_RESPONSE_DATA: Optional[bool] = Field(default=False, description="创建是否返回详情")
81
+ WHETHER_UPDATE_RESPONSE_DATA: Optional[bool] = Field(default=False, description="修改是否返回详情")
79
82
 
80
83
  # GetAll 筛选是否双下划线转单下划线
81
84
  FILTER_UNDERLINE_WHETHER_DOUBLE_TO_SINGLE: Optional[bool] = Field(default=True, description="筛选是否双下划线转单下划线")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.1.27
3
+ Version: 1.2.1
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -25,7 +25,7 @@ License-File: LICENSE
25
25
 
26
26
  #### 版本说明
27
27
  [pydantic-v2]
28
- 稳定版本:v1.1.15+
28
+ 稳定版本:v1.1.29+
29
29
  建议python版本:3.9+
30
30
  推荐fastapi版本:0.103.2+
31
31
  推荐pydantic版本:2.11.5+
@@ -107,16 +107,6 @@ class XxxView(APIView):
107
107
  model_class = XxxModel
108
108
  ```
109
109
 
110
- #### 继承 APIView 使用,关闭其中部分路由示例
111
- ```python
112
- from core.crud.api_view import APIView
113
-
114
- class XxxView(APIView):
115
- create_route = False
116
- get_one_route = False
117
- update_route = False
118
- delete_route = False
119
- ```
120
110
  #### 查询/创建/修改字段限制及校验示例
121
111
  - 如果有唯一字段或者联合唯一字段自动校验是否为唯一值
122
112
  ```python
@@ -1,14 +0,0 @@
1
- from tortoise import Model
2
-
3
- from fastgenerateapi.pydantic_utils.base_model import BaseModel
4
-
5
-
6
- class SaveMixin:
7
-
8
- async def set_save_model(self, model: Model, request_data, *args, **kwargs) -> Model:
9
- """
10
- 添加属性: model.user_id = current_user.id
11
- """
12
- return model
13
-
14
-