fastgenerateapi 0.0.27__tar.gz → 1.1.6__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 (121) hide show
  1. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/PKG-INFO +61 -24
  2. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/README.md +60 -23
  3. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/__init__.py +2 -2
  4. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/__version__.py +1 -1
  5. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/base_view.py +17 -7
  6. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/create_view.py +1 -1
  7. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/delete_filter_view.py +1 -1
  8. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/delete_tree_view.py +3 -3
  9. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/delete_view.py +3 -3
  10. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/get_all_view.py +21 -17
  11. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/get_one_view.py +1 -1
  12. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/get_relation_view.py +1 -1
  13. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/get_tree_view.py +1 -1
  14. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/base_mixin.py +11 -7
  15. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +30 -20
  16. fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/response_mixin.py +127 -0
  17. fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/tool_mixin.py +17 -0
  18. fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils/docx_util.py +399 -0
  19. fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils/file_util.py +30 -0
  20. fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils/pdf_util.py +76 -0
  21. fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +336 -0
  22. fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils/zip_util.py +50 -0
  23. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/switch_view.py +11 -11
  24. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/update_relation_view.py +3 -3
  25. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/update_view.py +1 -1
  26. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/cache/cache_decorator.py +1 -1
  27. fastgenerateapi-1.1.6/fastgenerateapi/controller/filter_controller.py +154 -0
  28. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/controller/router_controller.py +9 -9
  29. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/controller/rpc_controller.py +1 -1
  30. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/controller/ws_controller.py +1 -1
  31. fastgenerateapi-1.1.6/fastgenerateapi/deps/filter_params_deps.py +55 -0
  32. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/deps/paginator_deps.py +4 -4
  33. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/deps/tree_params_deps.py +4 -4
  34. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/example/models.py +3 -2
  35. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/example/schemas.py +1 -1
  36. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/example/views.py +1 -1
  37. fastgenerateapi-1.1.6/fastgenerateapi/fastapi_utils/all.py +5 -0
  38. fastgenerateapi-1.1.6/fastgenerateapi/fastapi_utils/param_utils.py +37 -0
  39. fastgenerateapi-1.1.6/fastgenerateapi/fastapi_utils/response_utils.py +344 -0
  40. fastgenerateapi-1.1.6/fastgenerateapi/model/__init__.py +0 -0
  41. fastgenerateapi-1.1.6/fastgenerateapi/model/base_model.py +56 -0
  42. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/enum_field.py +8 -8
  43. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/pk_field.py +1 -1
  44. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/soft_delete_field.py +4 -3
  45. fastgenerateapi-1.1.6/fastgenerateapi/my_fields/validator.py +60 -0
  46. fastgenerateapi-1.1.6/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  47. fastgenerateapi-1.1.6/fastgenerateapi/pydantic_utils/base_model.py +67 -0
  48. fastgenerateapi-1.1.6/fastgenerateapi/pydantic_utils/base_settings.py +16 -0
  49. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/pydantic_utils/json_encoders.py +2 -1
  50. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/common_function.py +1 -1
  51. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/common_schema_factory.py +4 -4
  52. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/create_schema_factory.py +4 -4
  53. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/filter_schema_factory.py +6 -6
  54. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +5 -5
  55. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +4 -3
  56. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +3 -3
  57. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +3 -3
  58. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/response_factory.py +5 -10
  59. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +3 -3
  60. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/update_schema_factory.py +4 -4
  61. fastgenerateapi-1.1.6/fastgenerateapi/settings/__init__.py +9 -0
  62. fastgenerateapi-1.1.6/fastgenerateapi/settings/all_settings.py +91 -0
  63. fastgenerateapi-0.0.27/fastgenerateapi/settings/settings.py → fastgenerateapi-1.1.6/fastgenerateapi/settings/app_settings.py +31 -28
  64. fastgenerateapi-1.1.6/fastgenerateapi/settings/db_settings.py +69 -0
  65. fastgenerateapi-1.1.6/fastgenerateapi/settings/file_settings.py +24 -0
  66. fastgenerateapi-1.1.6/fastgenerateapi/settings/jwt_settings.py +23 -0
  67. fastgenerateapi-1.1.6/fastgenerateapi/settings/otlp_settings.py +69 -0
  68. fastgenerateapi-1.1.6/fastgenerateapi/settings/redis_settings.py +16 -0
  69. fastgenerateapi-1.1.6/fastgenerateapi/settings/sms_settings.py +25 -0
  70. fastgenerateapi-1.1.6/fastgenerateapi/settings/system_settings.py +30 -0
  71. fastgenerateapi-1.1.6/fastgenerateapi/utils/__init__.py +0 -0
  72. fastgenerateapi-1.1.6/fastgenerateapi/utils/auto_discover.py +61 -0
  73. fastgenerateapi-1.1.6/fastgenerateapi/utils/file_utils.py +76 -0
  74. fastgenerateapi-1.1.6/fastgenerateapi/utils/pwd_utils.py +49 -0
  75. fastgenerateapi-1.1.6/fastgenerateapi/utils/ramdom_utils.py +48 -0
  76. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/utils/snowflake.py +23 -20
  77. fastgenerateapi-1.1.6/fastgenerateapi/utils/str_util.py +120 -0
  78. fastgenerateapi-1.1.6/fastgenerateapi/utils/swagger_to_js.py +26 -0
  79. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi.egg-info/PKG-INFO +61 -24
  80. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi.egg-info/SOURCES.txt +31 -4
  81. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi.egg-info/top_level.txt +1 -0
  82. fastgenerateapi-1.1.6/script/__init__.py +2 -0
  83. fastgenerateapi-0.0.27/fastgenerateapi/api_view/mixin/response_mixin.py +0 -80
  84. fastgenerateapi-0.0.27/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -373
  85. fastgenerateapi-0.0.27/fastgenerateapi/controller/filter_controller.py +0 -112
  86. fastgenerateapi-0.0.27/fastgenerateapi/deps/filter_params_deps.py +0 -25
  87. fastgenerateapi-0.0.27/fastgenerateapi/pydantic_utils/base_model.py +0 -34
  88. fastgenerateapi-0.0.27/fastgenerateapi/settings/__init__.py +0 -3
  89. fastgenerateapi-0.0.27/fastgenerateapi/settings/register_settings.py +0 -6
  90. fastgenerateapi-0.0.27/fastgenerateapi/utils/parse_str.py +0 -36
  91. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/LICENSE +0 -0
  92. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/__init__.py +0 -0
  93. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/api_view.py +0 -0
  94. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  95. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
  96. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
  97. {fastgenerateapi-0.0.27/fastgenerateapi/cache → fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils}/__init__.py +0 -0
  98. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/sql_get_view.py +0 -0
  99. {fastgenerateapi-0.0.27/fastgenerateapi/channel → fastgenerateapi-1.1.6/fastgenerateapi/cache}/__init__.py +0 -0
  100. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/cache/key_builder.py +0 -0
  101. {fastgenerateapi-0.0.27/fastgenerateapi/data_type → fastgenerateapi-1.1.6/fastgenerateapi/channel}/__init__.py +0 -0
  102. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/channel/consumer.py +0 -0
  103. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/channel/websocket_view.py +0 -0
  104. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/controller/__init__.py +0 -0
  105. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/controller/search_controller.py +0 -0
  106. {fastgenerateapi-0.0.27/fastgenerateapi/example → fastgenerateapi-1.1.6/fastgenerateapi/data_type}/__init__.py +0 -0
  107. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/data_type/data_type.py +0 -0
  108. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  109. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/deps/__init__.py +0 -0
  110. {fastgenerateapi-0.0.27/fastgenerateapi/pydantic_utils → fastgenerateapi-1.1.6/fastgenerateapi/example}/__init__.py +0 -0
  111. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/example/routers.py +0 -0
  112. {fastgenerateapi-0.0.27/fastgenerateapi/utils → fastgenerateapi-1.1.6/fastgenerateapi/fastapi_utils}/__init__.py +0 -0
  113. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/__init__.py +0 -0
  114. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/aes_field.py +0 -0
  115. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  116. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  117. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/utils/aes.py +0 -0
  118. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/utils/exception.py +0 -0
  119. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  120. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/setup.cfg +0 -0
  121. {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 0.0.27
3
+ Version: 1.1.6
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -23,17 +23,25 @@ License-File: LICENSE
23
23
 
24
24
  [Github](https://github.com/ShiLiangAPI)
25
25
 
26
- #### 介绍
26
+ #### 版本说明
27
+ 最新版本:v1.1.6
28
+ 建议python版本:3.9+
29
+ 推荐fastapi版本:0.103.2
30
+ 推荐pydantic版本:2.11.5
31
+
27
32
  稳定版本:v0.0.21
28
33
  建议python版本:3.9+
29
34
  推荐fastapi版本:0.97.0
30
35
 
31
- ###### FastGenerateApi 使用说明
32
36
 
33
37
 
38
+ ###### FastGenerateApi 使用说明
39
+ ```text
40
+ FastGenerateApi(<= 0.0.28) == FastApi 0.97.0
41
+ ```
34
42
  #### 软件架构说明
35
43
 
36
- ```
44
+ ```text
37
45
  封装了 快速生成API,包括(增,删,改,查,递归查询,递归删除,关联修改,关联查询)
38
46
  封装了 新增缓存配置,默认不使用缓存;新增树状查询方案,可配置选择
39
47
  封装了 Websocket API和分组消息发送
@@ -44,7 +52,6 @@ License-File: LICENSE
44
52
  封装了 通过数据库模型,自动生成schemas,并swagger附带文档
45
53
  封装了 类方法的实现,增加了相关的钩子函数
46
54
  封装了 通用性接口,例如excel的导入导出,pdf文件生成,模型数据跨表取值
47
- 待封装 RPC的调用
48
55
  ```
49
56
 
50
57
  #### 使用教程
@@ -90,29 +97,59 @@ uvicorn.run(app)
90
97
  - create_include, create_exclude
91
98
  - update_include, update_exclude
92
99
 
100
+ #### 指定模型
101
+ ```python
102
+ from core.crud.api_view import APIView
103
+
104
+ class XxxView(APIView):
105
+ model_class = XxxModel
93
106
  ```
94
- 待完成...
107
+
108
+ #### 继承 APIView 使用,关闭其中部分路由示例
109
+ ```python
110
+ from core.crud.api_view import APIView
111
+
112
+ class XxxView(APIView):
113
+ create_route = False
114
+ get_one_route = False
115
+ update_route = False
116
+ delete_route = False
117
+ ```
118
+ #### 查询/创建/修改字段限制及校验示例
119
+ - 如果有唯一字段或者联合唯一字段自动校验是否为唯一值
120
+ ```python
121
+ from core.crud.api_view import APIView
122
+
123
+ class XxxView(APIView):
124
+ list_schema = HeathInfoList
125
+ create_schema = HeathInfoCreate
126
+ update_schema = HeathInfoCreate
127
+ ```
128
+ #### 筛选::默认双下划线(__)自动转为单划线(_),可配置参数修改
129
+ - search_fields 搜索字段,可多个
130
+ - filter_fields 筛选字段,第一个必须双划线的联表查询字段,后续吴排序要求,可以选择:类型,重命名等
131
+ - prefetch_related_fields 跨表导出字段
132
+ - order_by_fields 排序字段,可多个
133
+ #### 自定义接口
134
+ ```python
135
+ class XxxView(APIView):
136
+
137
+ def view_路由(self):
138
+ """
139
+ 文档注释
140
+ """
141
+ return xxx
95
142
  ```
96
143
 
144
+
97
145
  #### 3. 查询筛选文档注意项
98
- 本地FastAPI源码修改,上线部署不需要修改
99
- - (fastapi == 0.97.0、0.87.0)源码修改
100
- - 文件路径:fastapi/dependencies/utils.py/第302行
101
- - 可搜索方法:get_dependant
102
- ```
103
- ...
104
- param_field = get_param_field(
105
- param=param, default_field_info=params.Query, param_name=param_name
106
- )
107
- ############### 添加内容 ####################
108
- try:
109
- if type(call).__name__ == 'ModelMetaclass' and issubclass(call, BaseModel):
110
- param.default.description = call.__fields__.get(param_name).field_info.description
111
- except:
112
- ...
113
- ##################################
114
- if param_name in path_param_names:
115
- ...
146
+ - 谨慎引入:如果Fastapi版本不一致可能错误
147
+ - 在实例化Fastapi页面引入即可
148
+ ```
149
+ from fastapi_utils.all import *
150
+ # 相当于
151
+ # from fastapi_utils.param_utils import * # GET查询使用Depends注入description文档
152
+ # from fastapi_utils.response_utils import * # 把数据储存到request.scope,方便中间键读取
116
153
  ```
117
154
 
118
155
  #### 4、其他接口书写方式
@@ -5,17 +5,25 @@
5
5
 
6
6
  [Github](https://github.com/ShiLiangAPI)
7
7
 
8
- #### 介绍
8
+ #### 版本说明
9
+ 最新版本:v1.1.6
10
+ 建议python版本:3.9+
11
+ 推荐fastapi版本:0.103.2
12
+ 推荐pydantic版本:2.11.5
13
+
9
14
  稳定版本:v0.0.21
10
15
  建议python版本:3.9+
11
16
  推荐fastapi版本:0.97.0
12
17
 
13
- ###### FastGenerateApi 使用说明
14
18
 
15
19
 
20
+ ###### FastGenerateApi 使用说明
21
+ ```text
22
+ FastGenerateApi(<= 0.0.28) == FastApi 0.97.0
23
+ ```
16
24
  #### 软件架构说明
17
25
 
18
- ```
26
+ ```text
19
27
  封装了 快速生成API,包括(增,删,改,查,递归查询,递归删除,关联修改,关联查询)
20
28
  封装了 新增缓存配置,默认不使用缓存;新增树状查询方案,可配置选择
21
29
  封装了 Websocket API和分组消息发送
@@ -26,7 +34,6 @@
26
34
  封装了 通过数据库模型,自动生成schemas,并swagger附带文档
27
35
  封装了 类方法的实现,增加了相关的钩子函数
28
36
  封装了 通用性接口,例如excel的导入导出,pdf文件生成,模型数据跨表取值
29
- 待封装 RPC的调用
30
37
  ```
31
38
 
32
39
  #### 使用教程
@@ -72,29 +79,59 @@ uvicorn.run(app)
72
79
  - create_include, create_exclude
73
80
  - update_include, update_exclude
74
81
 
82
+ #### 指定模型
83
+ ```python
84
+ from core.crud.api_view import APIView
85
+
86
+ class XxxView(APIView):
87
+ model_class = XxxModel
75
88
  ```
76
- 待完成...
89
+
90
+ #### 继承 APIView 使用,关闭其中部分路由示例
91
+ ```python
92
+ from core.crud.api_view import APIView
93
+
94
+ class XxxView(APIView):
95
+ create_route = False
96
+ get_one_route = False
97
+ update_route = False
98
+ delete_route = False
99
+ ```
100
+ #### 查询/创建/修改字段限制及校验示例
101
+ - 如果有唯一字段或者联合唯一字段自动校验是否为唯一值
102
+ ```python
103
+ from core.crud.api_view import APIView
104
+
105
+ class XxxView(APIView):
106
+ list_schema = HeathInfoList
107
+ create_schema = HeathInfoCreate
108
+ update_schema = HeathInfoCreate
109
+ ```
110
+ #### 筛选::默认双下划线(__)自动转为单划线(_),可配置参数修改
111
+ - search_fields 搜索字段,可多个
112
+ - filter_fields 筛选字段,第一个必须双划线的联表查询字段,后续吴排序要求,可以选择:类型,重命名等
113
+ - prefetch_related_fields 跨表导出字段
114
+ - order_by_fields 排序字段,可多个
115
+ #### 自定义接口
116
+ ```python
117
+ class XxxView(APIView):
118
+
119
+ def view_路由(self):
120
+ """
121
+ 文档注释
122
+ """
123
+ return xxx
77
124
  ```
78
125
 
126
+
79
127
  #### 3. 查询筛选文档注意项
80
- 本地FastAPI源码修改,上线部署不需要修改
81
- - (fastapi == 0.97.0、0.87.0)源码修改
82
- - 文件路径:fastapi/dependencies/utils.py/第302行
83
- - 可搜索方法:get_dependant
84
- ```
85
- ...
86
- param_field = get_param_field(
87
- param=param, default_field_info=params.Query, param_name=param_name
88
- )
89
- ############### 添加内容 ####################
90
- try:
91
- if type(call).__name__ == 'ModelMetaclass' and issubclass(call, BaseModel):
92
- param.default.description = call.__fields__.get(param_name).field_info.description
93
- except:
94
- ...
95
- ##################################
96
- if param_name in path_param_names:
97
- ...
128
+ - 谨慎引入:如果Fastapi版本不一致可能错误
129
+ - 在实例化Fastapi页面引入即可
130
+ ```
131
+ from fastapi_utils.all import *
132
+ # 相当于
133
+ # from fastapi_utils.param_utils import * # GET查询使用Depends注入description文档
134
+ # from fastapi_utils.response_utils import * # 把数据储存到request.scope,方便中间键读取
98
135
  ```
99
136
 
100
137
  #### 4、其他接口书写方式
@@ -23,6 +23,6 @@ from fastgenerateapi.api_view.update_relation_view import UpdateRelationView
23
23
  from fastgenerateapi.channel.websocket_view import WebsocketView
24
24
  from fastgenerateapi.channel.consumer import Consumer
25
25
 
26
- # 查看配置模型
27
- from fastgenerateapi.settings.settings import SettingsModel
26
+ # 模型相关类
27
+ from fastgenerateapi.pydantic_utils.base_model import model_config, BaseModel, IdList
28
28
 
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (0, 0, 27)
11
+ VERSION = (1, 1, 6)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -15,7 +15,7 @@ from fastgenerateapi.api_view.mixin.base_mixin import BaseMixin
15
15
  from fastgenerateapi.api_view.mixin.dbmodel_mixin import DBModelMixin
16
16
  from fastgenerateapi.api_view.mixin.response_mixin import ResponseMixin
17
17
  from fastgenerateapi.api_view.mixin.tool_mixin import ToolMixin
18
- from fastgenerateapi.settings.register_settings import settings
18
+ from fastgenerateapi.settings.all_settings import settings
19
19
  from fastgenerateapi.utils.exception import NOT_FOUND
20
20
 
21
21
 
@@ -93,10 +93,17 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
93
93
  return result
94
94
 
95
95
  async def delete_queryset(self, queryset: QuerySet):
96
-
97
- await queryset.update(**{
98
- settings.app_settings.WHETHER_DELETE_FIELD: self._delete_value()
99
- })
96
+ """
97
+ 考虑到不一定会集成已有的模型,删除根据是否存在字段来判断
98
+ :param queryset:
99
+ :return:
100
+ """
101
+ if settings.app_settings.WHETHER_DELETE_FIELD in queryset.fields:
102
+ await queryset.update(**{
103
+ settings.app_settings.WHETHER_DELETE_FIELD: self._delete_value()
104
+ })
105
+ else:
106
+ await queryset.delete()
100
107
 
101
108
  @staticmethod
102
109
  async def setattr_model(model: Model, prefetch_related_fields, *args, **kwargs) -> Model:
@@ -137,8 +144,11 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
137
144
  attr_model = getattr(attr_model, attr_key, None)
138
145
  model_dict[field[1]] = attr_model
139
146
  model_fields[field[1]] = (type(attr_model), ...)
140
- schema = create_model(__model_name=f"{Model.__name__}{uuid.uuid4()}", **model_fields)
141
- return schema.parse_obj(model_dict)
147
+ schema = create_model(
148
+ f"{Model.__name__}{uuid.uuid4()}",
149
+ **model_fields
150
+ )
151
+ return schema.model_validate(model_dict)
142
152
 
143
153
  async def check_unique_field(
144
154
  self,
@@ -11,7 +11,7 @@ from fastgenerateapi.api_view.base_view import BaseView
11
11
  from fastgenerateapi.api_view.mixin.save_mixin import SaveMixin
12
12
  from fastgenerateapi.data_type.data_type import DEPENDENCIES
13
13
  from fastgenerateapi.schemas_factory import get_one_schema_factory, create_schema_factory, response_factory
14
- from fastgenerateapi.settings.register_settings import settings
14
+ from fastgenerateapi.settings.all_settings import settings
15
15
 
16
16
 
17
17
  class CreateView(BaseView, SaveMixin):
@@ -10,7 +10,7 @@ from fastgenerateapi.api_view.base_view import BaseView
10
10
  from fastgenerateapi.data_type.data_type import CALLABLE, DEPENDENCIES
11
11
  from fastgenerateapi.deps import filter_params_deps
12
12
  from fastgenerateapi.schemas_factory import response_factory
13
- from fastgenerateapi.settings.register_settings import settings
13
+ from fastgenerateapi.settings.all_settings import settings
14
14
 
15
15
 
16
16
  class DeleteFilterView(BaseView):
@@ -9,15 +9,15 @@ from tortoise.transactions import atomic
9
9
 
10
10
  from fastgenerateapi.api_view.base_view import BaseView
11
11
  from fastgenerateapi.data_type.data_type import CALLABLE, DEPENDENCIES
12
- from fastgenerateapi.pydantic_utils.base_model import IDList
12
+ from fastgenerateapi.pydantic_utils.base_model import IdList
13
13
  from fastgenerateapi.schemas_factory import response_factory
14
- from fastgenerateapi.settings.register_settings import settings
14
+ from fastgenerateapi.settings.all_settings import settings
15
15
 
16
16
 
17
17
  class DeleteTreeView(BaseView):
18
18
 
19
19
  delete_tree_route: Union[bool, DEPENDENCIES] = True
20
- delete_tree_schema: Optional[Type[BaseModel]] = IDList
20
+ delete_tree_schema: Optional[Type[BaseModel]] = IdList
21
21
  """
22
22
  delete_route: 删除路由开关,可以放依赖函数列表
23
23
  delete_schema: 删除请求模型
@@ -9,15 +9,15 @@ from tortoise.transactions import atomic
9
9
 
10
10
  from fastgenerateapi.api_view.base_view import BaseView
11
11
  from fastgenerateapi.data_type.data_type import CALLABLE, DEPENDENCIES
12
- from fastgenerateapi.pydantic_utils.base_model import IDList
12
+ from fastgenerateapi.pydantic_utils.base_model import IdList
13
13
  from fastgenerateapi.schemas_factory import response_factory
14
- from fastgenerateapi.settings.register_settings import settings
14
+ from fastgenerateapi.settings.all_settings import settings
15
15
 
16
16
 
17
17
  class DeleteView(BaseView):
18
18
 
19
19
  delete_route: Union[bool, DEPENDENCIES] = True
20
- delete_schema: Optional[Type[BaseModel]] = IDList
20
+ delete_schema: Optional[Type[BaseModel]] = IdList
21
21
  """
22
22
  delete_route: 删除路由开关,可以放依赖函数列表
23
23
  delete_schema: 删除请求模型
@@ -16,19 +16,20 @@ from fastgenerateapi.api_view.mixin.get_mixin import GetMixin
16
16
  from fastgenerateapi.cache.cache_decorator import get_all_cache_decorator
17
17
  from fastgenerateapi.cache.key_builder import generate_key_builder
18
18
  from fastgenerateapi.controller import SearchController, BaseFilter, FilterController
19
- from fastgenerateapi.data_type.data_type import DEPENDENCIES
19
+ from fastgenerateapi.data_type.data_type import DEPENDENCIES, PYDANTIC_SCHEMA
20
20
  from fastgenerateapi.deps import paginator_deps, filter_params_deps
21
+ from fastgenerateapi.deps.filter_params_deps import search_params_deps
21
22
  from fastgenerateapi.schemas_factory import get_all_schema_factory, get_page_schema_factory, get_one_schema_factory, \
22
23
  response_factory
23
24
  from fastgenerateapi.schemas_factory.get_all_schema_factory import get_list_schema_factory
24
- from fastgenerateapi.settings.register_settings import settings
25
+ from fastgenerateapi.settings.all_settings import settings
25
26
 
26
27
 
27
28
  class GetAllView(BaseView, GetMixin):
28
-
29
29
  get_all_route: Union[bool, DEPENDENCIES] = True
30
- get_all_schema: Optional[Type[BaseModel]] = None
30
+ get_all_schema: Optional[Type[PYDANTIC_SCHEMA]] = None
31
31
  search_fields: Union[None, list] = None
32
+ filter_schema: Optional[Type[PYDANTIC_SCHEMA]] = None
32
33
  filter_fields: Union[None, list] = None
33
34
  order_by_fields: Union[None, list] = None
34
35
  """
@@ -45,12 +46,12 @@ class GetAllView(BaseView, GetMixin):
45
46
  order_by_fields: 排序对应字段
46
47
  """
47
48
 
48
- async def get_all(self, search: str, filters: dict, *args, **kwargs) -> Union[BaseModel, dict, None]:
49
+ async def get_all(self, search: Optional[str], filters: dict, *args, **kwargs) -> Union[BaseModel, dict, None]:
49
50
  queryset = await self.get_queryset(search=search, filters=filters, *args, **kwargs)
50
51
 
51
52
  return await self.pagination_data(queryset=queryset, *args, **kwargs)
52
53
 
53
- async def get_queryset(self, search: str, filters: dict, *args, **kwargs) -> QuerySet:
54
+ async def get_queryset(self, search: Optional[str], filters: dict, *args, **kwargs) -> QuerySet:
54
55
  """
55
56
  处理search搜索;处理筛选字段;处理外键预加载;处理排序
56
57
  """
@@ -81,14 +82,15 @@ class GetAllView(BaseView, GetMixin):
81
82
  async def pagination_data(
82
83
  self,
83
84
  queryset: QuerySet,
84
- paginator,
85
+ paginator=None,
85
86
  schema: Type[BaseModel] = None,
86
87
  fields: List[Union[str, tuple]] = None,
87
88
  *args, **kwargs
88
89
  ):
89
90
 
90
91
  data_list = []
91
- if getattr(paginator, settings.app_settings.DETERMINE_WHETHER_PAGE_FIELD) == settings.app_settings.DETERMINE_PAGE_BOOL_VALUE:
92
+ if paginator is None or getattr(paginator, settings.app_settings.DETERMINE_WHETHER_PAGE_FIELD) == \
93
+ settings.app_settings.DETERMINE_PAGE_BOOL_VALUE:
92
94
  model_list = await queryset.all()
93
95
  else:
94
96
  count = await queryset.count()
@@ -112,7 +114,8 @@ class GetAllView(BaseView, GetMixin):
112
114
  else:
113
115
  data_list.append(self.get_all_schema.from_orm(model))
114
116
 
115
- if getattr(paginator, settings.app_settings.DETERMINE_WHETHER_PAGE_FIELD) == settings.app_settings.DETERMINE_PAGE_BOOL_VALUE:
117
+ if paginator is None or getattr(paginator, settings.app_settings.DETERMINE_WHETHER_PAGE_FIELD) == \
118
+ settings.app_settings.DETERMINE_PAGE_BOOL_VALUE:
116
119
  if schema or fields:
117
120
  return get_list_schema_factory()(**{settings.app_settings.LIST_RESPONSE_FIELD: data_list})
118
121
  return self.get_list_schema(**{settings.app_settings.LIST_RESPONSE_FIELD: data_list})
@@ -134,12 +137,13 @@ class GetAllView(BaseView, GetMixin):
134
137
  return getattr(page_result, settings.app_settings.LIST_RESPONSE_FIELD, [])
135
138
 
136
139
  def _get_all_decorator(self, *args: Any, **kwargs: Any) -> DecoratedCallable:
137
- @get_all_cache_decorator(cache(expire=settings.app_settings.CACHE_GET_ALL_SECONDS, coder=JsonCoder, key_builder=generate_key_builder))
140
+ @get_all_cache_decorator(cache(expire=settings.app_settings.CACHE_GET_ALL_SECONDS, coder=JsonCoder,
141
+ key_builder=generate_key_builder))
138
142
  async def route(
139
143
  request: Request,
140
144
  paginator=Depends(paginator_deps()),
141
- search: str = Query(default="", description="搜索"),
142
- filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields)),
145
+ search: Optional[str] = Depends(search_params_deps(self.search_fields)),
146
+ filters: dict = Depends(filter_params_deps(model_class=self.model_class, fields=self.filter_fields, schema=self.filter_schema)),
143
147
  ) -> JSONResponse:
144
148
  data = await self.get_all(
145
149
  paginator=paginator,
@@ -150,14 +154,17 @@ class GetAllView(BaseView, GetMixin):
150
154
  **kwargs
151
155
  )
152
156
  return self.success(data=data)
157
+
153
158
  return route
154
159
 
155
160
  def _handler_get_all_settings(self):
156
161
  if not self.get_all_route:
157
162
  return
158
163
  self.search_controller = SearchController(self.get_base_filter(self.search_fields))
159
- self.filter_controller = FilterController(self.get_base_filter(self.filter_fields))
160
- self.get_all_schema = self.get_all_schema or get_all_schema_factory(self.model_class) or self.get_one_schema if hasattr(self, "get_one_schema") else get_one_schema_factory(self.model_class)
164
+ self.filter_controller = FilterController(self.get_base_filter(self.filter_fields, self.filter_schema))
165
+ self.get_all_schema = self.get_all_schema or get_all_schema_factory(
166
+ self.model_class) or self.get_one_schema if hasattr(self, "get_one_schema") else get_one_schema_factory(
167
+ self.model_class)
161
168
  self.get_page_schema = get_page_schema_factory(self.get_all_schema)
162
169
  self.get_list_schema = get_list_schema_factory(self.get_all_schema)
163
170
  self.get_all_response_schema = response_factory(self.get_page_schema, name="GetPage")
@@ -172,6 +179,3 @@ class GetAllView(BaseView, GetMixin):
172
179
  summary=summary,
173
180
  dependencies=self.get_all_route,
174
181
  )
175
-
176
-
177
-
@@ -14,7 +14,7 @@ from fastgenerateapi.cache.cache_decorator import get_one_cache_decorator
14
14
  from fastgenerateapi.cache.key_builder import generate_key_builder
15
15
  from fastgenerateapi.data_type.data_type import CALLABLE, DEPENDENCIES
16
16
  from fastgenerateapi.schemas_factory import get_one_schema_factory, response_factory
17
- from fastgenerateapi.settings.register_settings import settings
17
+ from fastgenerateapi.settings.all_settings import settings
18
18
  from fastgenerateapi.utils.exception import NOT_FOUND
19
19
 
20
20
 
@@ -16,7 +16,7 @@ from fastgenerateapi.deps import paginator_deps, filter_params_deps
16
16
  from fastgenerateapi.schemas_factory import get_page_schema_factory, response_factory
17
17
  from fastgenerateapi.schemas_factory.get_all_schema_factory import get_list_schema_factory
18
18
  from fastgenerateapi.schemas_factory.get_relation_schema_factory import get_relation_schema_factory
19
- from fastgenerateapi.settings.register_settings import settings
19
+ from fastgenerateapi.settings.all_settings import settings
20
20
 
21
21
 
22
22
  class GetRelationView(BaseView):
@@ -25,7 +25,7 @@ from fastgenerateapi.deps import paginator_deps, filter_params_deps
25
25
  from fastgenerateapi.deps.tree_params_deps import tree_params_deps
26
26
  from fastgenerateapi.schemas_factory import get_one_schema_factory, response_factory
27
27
  from fastgenerateapi.schemas_factory.get_tree_schema_factory import get_tree_schema_factory
28
- from fastgenerateapi.settings.register_settings import settings
28
+ from fastgenerateapi.settings.all_settings import settings
29
29
 
30
30
 
31
31
  class GetTreeView(BaseView):
@@ -10,10 +10,10 @@ from fastgenerateapi.controller.filter_controller import BaseFilter
10
10
  from fastgenerateapi.controller import RouterController
11
11
  from fastgenerateapi.controller.ws_controller import WsController
12
12
 
13
- from fastgenerateapi.settings.register_settings import settings
13
+ from fastgenerateapi.settings.all_settings import settings
14
14
  from starlette.exceptions import HTTPException
15
15
 
16
- from fastgenerateapi.data_type.data_type import DEPENDENCIES, T
16
+ from fastgenerateapi.data_type.data_type import DEPENDENCIES, T, PYDANTIC_SCHEMA
17
17
 
18
18
 
19
19
  class BaseMixin(Generic[T], APIRouter, ABC):
@@ -52,10 +52,13 @@ class BaseMixin(Generic[T], APIRouter, ABC):
52
52
  # if hasattr(self, "_handler_sql_get_all_settings"):
53
53
  # getattr(self, "_handler_sql_get_all_settings")()
54
54
 
55
- def get_base_filter(self, fields: list) -> list:
56
- if fields is None:
57
- return []
58
- return [BaseFilter(field) if not isinstance(field, BaseFilter) else field for field in fields]
55
+ def get_base_filter(self, fields: list, schema: Optional[PYDANTIC_SCHEMA] = None) -> list:
56
+ bast_filter_list = []
57
+ if fields:
58
+ bast_filter_list += [BaseFilter(field) if not isinstance(field, BaseFilter) else field for field in fields]
59
+ if schema:
60
+ bast_filter_list += [BaseFilter((field, model_field.alias)) for field, model_field in schema.__fields__.items()]
61
+ return bast_filter_list
59
62
 
60
63
  @staticmethod
61
64
  def _get_routes(is_controller_field: bool = False) -> List[str]:
@@ -70,7 +73,8 @@ class BaseMixin(Generic[T], APIRouter, ABC):
70
73
  def _get_cls_api_func(cls):
71
74
  func_list = inspect.getmembers(cls, inspect.isfunction)
72
75
 
73
- return [(func[0], inspect.signature(func[1]).return_annotation) for func in func_list if func[0].startswith("view_")]
76
+ return [(func[0], inspect.signature(func[1]).return_annotation) for func in func_list if
77
+ func[0].startswith("view_")]
74
78
 
75
79
  @classmethod
76
80
  def _get_cls_ws_func(cls):
@@ -1,11 +1,19 @@
1
1
  import inspect
2
2
  from typing import Type, Union, List, Optional
3
3
 
4
- from fastgenerateapi.settings.register_settings import settings
4
+ from fastgenerateapi.settings.all_settings import settings
5
5
  from tortoise import Model
6
6
 
7
7
 
8
8
  class DBModelMixin:
9
+ others_description = {
10
+ "gt": "大于",
11
+ "gte": "大于等于",
12
+ "lt": "小于",
13
+ "lte": "小于等于",
14
+ "contains": "模糊搜索",
15
+ "in": "范围",
16
+ }
9
17
 
10
18
  @staticmethod
11
19
  def _get_pk_field(model_class: Type[Model]) -> str:
@@ -16,34 +24,33 @@ class DBModelMixin:
16
24
 
17
25
  @staticmethod
18
26
  def get_field_description(model_class: Type[Model], fields: Union[str, list, tuple, set]) -> str:
19
-
27
+ if fields in ["id", "pk"]:
28
+ return "主键"
20
29
  if type(fields) == str:
21
30
  try:
22
31
  field_info = model_class._meta.fields_map.get(fields)
23
32
  field_info_fk = model_class._meta.fields_map.get(fields.rstrip("_id"))
24
33
  if field_info:
25
- return field_info.description
34
+ return field_info.description or ""
26
35
  elif fields.endswith("_id") and field_info_fk:
27
- return field_info_fk.description
36
+ return field_info_fk.description or ""
28
37
  elif "__" in fields:
29
38
  field_list = fields.split("__", maxsplit=1)
30
39
  description = ""
31
40
  description += DBModelMixin.get_field_description(model_class=model_class, fields=field_list[0])
32
- description += DBModelMixin.get_field_description(
33
- model_class=DBModelMixin._get_foreign_key_relation_class(model_class=model_class, field=field_list[0]),
34
- fields=field_list[1]
35
- )
41
+ 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
+ else:
47
+ description += DBModelMixin.get_field_description(
48
+ model_class=DBModelMixin._get_foreign_key_relation_class(model_class=model_class, field=field_list[0]),
49
+ fields=field_list[1]
50
+ )
36
51
  return description
37
52
  else:
38
- others_description = {
39
- "gt": "大于",
40
- "gte": "大于等于",
41
- "lt": "小于",
42
- "lte": "小于等于",
43
- "contains": "模糊搜索",
44
- "in": "范围"
45
- }
46
- return others_description.get(fields, "")
53
+ return DBModelMixin.others_description.get(fields, "")
47
54
 
48
55
  except Exception:
49
56
  return fields
@@ -102,7 +109,10 @@ class DBModelMixin:
102
109
 
103
110
  @staticmethod
104
111
  def _get_foreign_key_relation_class(model_class: Type[Model], field: str) -> Type[Model]:
105
- module = inspect.getmodule(model_class, inspect.getfile(model_class))
106
- res_class = getattr(module, model_class._meta.fields_map.get(field).model_name.split(".")[1])
107
- return res_class
112
+ try:
113
+ module = inspect.getmodule(model_class, inspect.getfile(model_class))
114
+ res_class = getattr(module, model_class._meta.fields_map.get(field).model_name.split(".")[1])
115
+ return res_class
116
+ except:
117
+ return model_class
108
118