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.
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/PKG-INFO +61 -24
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/README.md +60 -23
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/__init__.py +2 -2
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/__version__.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/base_view.py +17 -7
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/create_view.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/delete_filter_view.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/delete_tree_view.py +3 -3
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/delete_view.py +3 -3
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/get_all_view.py +21 -17
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/get_one_view.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/get_relation_view.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/get_tree_view.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/base_mixin.py +11 -7
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +30 -20
- fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/response_mixin.py +127 -0
- fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/tool_mixin.py +17 -0
- fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils/docx_util.py +399 -0
- fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils/file_util.py +30 -0
- fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils/pdf_util.py +76 -0
- fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +336 -0
- fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils/zip_util.py +50 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/switch_view.py +11 -11
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/update_relation_view.py +3 -3
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/update_view.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/cache/cache_decorator.py +1 -1
- fastgenerateapi-1.1.6/fastgenerateapi/controller/filter_controller.py +154 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/controller/router_controller.py +9 -9
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/controller/rpc_controller.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/controller/ws_controller.py +1 -1
- fastgenerateapi-1.1.6/fastgenerateapi/deps/filter_params_deps.py +55 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/deps/paginator_deps.py +4 -4
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/deps/tree_params_deps.py +4 -4
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/example/models.py +3 -2
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/example/schemas.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/example/views.py +1 -1
- fastgenerateapi-1.1.6/fastgenerateapi/fastapi_utils/all.py +5 -0
- fastgenerateapi-1.1.6/fastgenerateapi/fastapi_utils/param_utils.py +37 -0
- fastgenerateapi-1.1.6/fastgenerateapi/fastapi_utils/response_utils.py +344 -0
- fastgenerateapi-1.1.6/fastgenerateapi/model/__init__.py +0 -0
- fastgenerateapi-1.1.6/fastgenerateapi/model/base_model.py +56 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/enum_field.py +8 -8
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/pk_field.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/soft_delete_field.py +4 -3
- fastgenerateapi-1.1.6/fastgenerateapi/my_fields/validator.py +60 -0
- fastgenerateapi-1.1.6/fastgenerateapi/pydantic_utils/__init__.py +0 -0
- fastgenerateapi-1.1.6/fastgenerateapi/pydantic_utils/base_model.py +67 -0
- fastgenerateapi-1.1.6/fastgenerateapi/pydantic_utils/base_settings.py +16 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/pydantic_utils/json_encoders.py +2 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/common_function.py +1 -1
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/common_schema_factory.py +4 -4
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/create_schema_factory.py +4 -4
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/filter_schema_factory.py +6 -6
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +5 -5
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +4 -3
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +3 -3
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +3 -3
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/response_factory.py +5 -10
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +3 -3
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/update_schema_factory.py +4 -4
- fastgenerateapi-1.1.6/fastgenerateapi/settings/__init__.py +9 -0
- fastgenerateapi-1.1.6/fastgenerateapi/settings/all_settings.py +91 -0
- fastgenerateapi-0.0.27/fastgenerateapi/settings/settings.py → fastgenerateapi-1.1.6/fastgenerateapi/settings/app_settings.py +31 -28
- fastgenerateapi-1.1.6/fastgenerateapi/settings/db_settings.py +69 -0
- fastgenerateapi-1.1.6/fastgenerateapi/settings/file_settings.py +24 -0
- fastgenerateapi-1.1.6/fastgenerateapi/settings/jwt_settings.py +23 -0
- fastgenerateapi-1.1.6/fastgenerateapi/settings/otlp_settings.py +69 -0
- fastgenerateapi-1.1.6/fastgenerateapi/settings/redis_settings.py +16 -0
- fastgenerateapi-1.1.6/fastgenerateapi/settings/sms_settings.py +25 -0
- fastgenerateapi-1.1.6/fastgenerateapi/settings/system_settings.py +30 -0
- fastgenerateapi-1.1.6/fastgenerateapi/utils/__init__.py +0 -0
- fastgenerateapi-1.1.6/fastgenerateapi/utils/auto_discover.py +61 -0
- fastgenerateapi-1.1.6/fastgenerateapi/utils/file_utils.py +76 -0
- fastgenerateapi-1.1.6/fastgenerateapi/utils/pwd_utils.py +49 -0
- fastgenerateapi-1.1.6/fastgenerateapi/utils/ramdom_utils.py +48 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/utils/snowflake.py +23 -20
- fastgenerateapi-1.1.6/fastgenerateapi/utils/str_util.py +120 -0
- fastgenerateapi-1.1.6/fastgenerateapi/utils/swagger_to_js.py +26 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi.egg-info/PKG-INFO +61 -24
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi.egg-info/SOURCES.txt +31 -4
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi.egg-info/top_level.txt +1 -0
- fastgenerateapi-1.1.6/script/__init__.py +2 -0
- fastgenerateapi-0.0.27/fastgenerateapi/api_view/mixin/response_mixin.py +0 -80
- fastgenerateapi-0.0.27/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -373
- fastgenerateapi-0.0.27/fastgenerateapi/controller/filter_controller.py +0 -112
- fastgenerateapi-0.0.27/fastgenerateapi/deps/filter_params_deps.py +0 -25
- fastgenerateapi-0.0.27/fastgenerateapi/pydantic_utils/base_model.py +0 -34
- fastgenerateapi-0.0.27/fastgenerateapi/settings/__init__.py +0 -3
- fastgenerateapi-0.0.27/fastgenerateapi/settings/register_settings.py +0 -6
- fastgenerateapi-0.0.27/fastgenerateapi/utils/parse_str.py +0 -36
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/LICENSE +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/api_view.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
- {fastgenerateapi-0.0.27/fastgenerateapi/cache → fastgenerateapi-1.1.6/fastgenerateapi/api_view/mixin/utils}/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/sql_get_view.py +0 -0
- {fastgenerateapi-0.0.27/fastgenerateapi/channel → fastgenerateapi-1.1.6/fastgenerateapi/cache}/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/cache/key_builder.py +0 -0
- {fastgenerateapi-0.0.27/fastgenerateapi/data_type → fastgenerateapi-1.1.6/fastgenerateapi/channel}/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/channel/consumer.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/channel/websocket_view.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/controller/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/controller/search_controller.py +0 -0
- {fastgenerateapi-0.0.27/fastgenerateapi/example → fastgenerateapi-1.1.6/fastgenerateapi/data_type}/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/data_type/data_type.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/deps/__init__.py +0 -0
- {fastgenerateapi-0.0.27/fastgenerateapi/pydantic_utils → fastgenerateapi-1.1.6/fastgenerateapi/example}/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/example/routers.py +0 -0
- {fastgenerateapi-0.0.27/fastgenerateapi/utils → fastgenerateapi-1.1.6/fastgenerateapi/fastapi_utils}/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/aes_field.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/my_fields/pwd_field.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/schemas_factory/__init__.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/utils/aes.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/utils/exception.py +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
- {fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/setup.cfg +0 -0
- {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:
|
|
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
|
-
|
|
99
|
-
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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
|
-
|
|
81
|
-
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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.
|
|
26
|
+
# 模型相关类
|
|
27
|
+
from fastgenerateapi.pydantic_utils.base_model import model_config, BaseModel, IdList
|
|
28
28
|
|
|
@@ -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.
|
|
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
|
-
|
|
98
|
-
|
|
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(
|
|
141
|
-
|
|
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.
|
|
14
|
+
from fastgenerateapi.settings.all_settings import settings
|
|
15
15
|
|
|
16
16
|
|
|
17
17
|
class CreateView(BaseView, SaveMixin):
|
{fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/delete_filter_view.py
RENAMED
|
@@ -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.
|
|
13
|
+
from fastgenerateapi.settings.all_settings import settings
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
class DeleteFilterView(BaseView):
|
{fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/delete_tree_view.py
RENAMED
|
@@ -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
|
|
12
|
+
from fastgenerateapi.pydantic_utils.base_model import IdList
|
|
13
13
|
from fastgenerateapi.schemas_factory import response_factory
|
|
14
|
-
from fastgenerateapi.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]] =
|
|
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
|
|
12
|
+
from fastgenerateapi.pydantic_utils.base_model import IdList
|
|
13
13
|
from fastgenerateapi.schemas_factory import response_factory
|
|
14
|
-
from fastgenerateapi.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]] =
|
|
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.
|
|
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[
|
|
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) ==
|
|
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) ==
|
|
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,
|
|
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 =
|
|
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(
|
|
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.
|
|
17
|
+
from fastgenerateapi.settings.all_settings import settings
|
|
18
18
|
from fastgenerateapi.utils.exception import NOT_FOUND
|
|
19
19
|
|
|
20
20
|
|
{fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/get_relation_view.py
RENAMED
|
@@ -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.
|
|
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.
|
|
28
|
+
from fastgenerateapi.settings.all_settings import settings
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class GetTreeView(BaseView):
|
{fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/base_mixin.py
RENAMED
|
@@ -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.
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
|
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):
|
{fastgenerateapi-0.0.27 → fastgenerateapi-1.1.6}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py
RENAMED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import inspect
|
|
2
2
|
from typing import Type, Union, List, Optional
|
|
3
3
|
|
|
4
|
-
from fastgenerateapi.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
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
|