fastgenerateapi 1.2.1__tar.gz → 1.2.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/PKG-INFO +8 -7
  2. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/README.md +7 -6
  3. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/__version__.py +1 -1
  4. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/create_view.py +15 -15
  5. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/delete_filter_view.py +2 -3
  6. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/delete_tree_view.py +2 -3
  7. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/delete_view.py +2 -3
  8. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/get_relation_view.py +1 -1
  9. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/get_tree_view.py +3 -3
  10. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/save_mixin.py +1 -1
  11. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/update_relation_view.py +4 -2
  12. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/update_view.py +19 -12
  13. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/controller/filter_controller.py +7 -3
  14. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/common_function.py +5 -2
  15. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/all_settings.py +2 -0
  16. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/app_settings.py +2 -1
  17. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi.egg-info/PKG-INFO +8 -7
  18. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/LICENSE +0 -0
  19. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/__init__.py +0 -0
  20. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/__init__.py +0 -0
  21. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/api_view.py +0 -0
  22. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/base_view.py +0 -0
  23. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/get_all_view.py +0 -0
  24. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/get_one_view.py +0 -0
  25. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  26. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/base_mixin.py +0 -0
  27. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +0 -0
  28. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/get_mixin.py +0 -0
  29. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
  30. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
  31. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
  32. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/utils/docx_util.py +0 -0
  33. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/utils/file_util.py +0 -0
  34. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/utils/pdf_util.py +0 -0
  35. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +0 -0
  36. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/mixin/utils/zip_util.py +0 -0
  37. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/sql_get_view.py +0 -0
  38. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/api_view/switch_view.py +0 -0
  39. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/cache/__init__.py +0 -0
  40. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/cache/cache_decorator.py +0 -0
  41. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/cache/key_builder.py +0 -0
  42. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/channel/__init__.py +0 -0
  43. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/channel/connection_manager.py +0 -0
  44. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/channel/consumer.py +0 -0
  45. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/channel/websocket_view.py +0 -0
  46. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/controller/__init__.py +0 -0
  47. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/controller/router_controller.py +0 -0
  48. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/controller/rpc_controller.py +0 -0
  49. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/controller/search_controller.py +0 -0
  50. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/controller/ws_controller.py +0 -0
  51. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/data_type/__init__.py +0 -0
  52. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/data_type/data_type.py +0 -0
  53. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  54. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/deps/__init__.py +0 -0
  55. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/deps/filter_params_deps.py +0 -0
  56. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/deps/paginator_deps.py +0 -0
  57. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/deps/tree_params_deps.py +0 -0
  58. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/example/__init__.py +0 -0
  59. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/example/models.py +0 -0
  60. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/example/routers.py +0 -0
  61. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/example/schemas.py +0 -0
  62. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/example/views.py +0 -0
  63. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
  64. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/fastapi_utils/all.py +0 -0
  65. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
  66. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
  67. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/model/__init__.py +0 -0
  68. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/model/base_model.py +0 -0
  69. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/my_fields/__init__.py +0 -0
  70. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/my_fields/aes_field.py +0 -0
  71. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/my_fields/enum_field.py +0 -0
  72. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/my_fields/pk_field.py +0 -0
  73. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  74. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
  75. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/my_fields/validator.py +0 -0
  76. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  77. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/pydantic_utils/base_model.py +0 -0
  78. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
  79. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
  80. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  81. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
  82. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/create_schema_factory.py +0 -0
  83. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/filter_schema_factory.py +0 -0
  84. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +0 -0
  85. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +0 -0
  86. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
  87. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
  88. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
  89. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
  90. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/schemas_factory/update_schema_factory.py +0 -0
  91. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/__init__.py +0 -0
  92. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/db_settings.py +0 -0
  93. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/etcd_settings.py +0 -0
  94. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/file_settings.py +0 -0
  95. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/jwt_settings.py +0 -0
  96. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/otlp_settings.py +0 -0
  97. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/redis_settings.py +0 -0
  98. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/sms_settings.py +0 -0
  99. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/settings/system_settings.py +0 -0
  100. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/utils/__init__.py +0 -0
  101. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/utils/aes.py +0 -0
  102. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/utils/auto_discover.py +0 -0
  103. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/utils/exception.py +0 -0
  104. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/utils/file_utils.py +0 -0
  105. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/utils/pwd_utils.py +0 -0
  106. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/utils/ramdom_utils.py +0 -0
  107. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/utils/snowflake.py +0 -0
  108. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/utils/str_util.py +0 -0
  109. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi/utils/swagger_to_js.py +0 -0
  110. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi.egg-info/SOURCES.txt +0 -0
  111. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  112. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/fastgenerateapi.egg-info/top_level.txt +0 -0
  113. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/script/__init__.py +0 -0
  114. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/setup.cfg +0 -0
  115. {fastgenerateapi-1.2.1 → fastgenerateapi-1.2.3}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.1
3
+ Version: 1.2.3
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -94,14 +94,14 @@ uvicorn.run(app)
94
94
  - get_one_include, get_one_exclude
95
95
  - 与include同时生效,无include自动包含数据库模型搜友字段
96
96
  - 可添加跨表字段,自动生成校验和文档
97
- - 其他字段: ("test", Optioanl[str], FieldInfo(..., description="文档描述"))
97
+ - 其他字段: ("test", Optional[str], FieldInfo(..., description="文档描述"))
98
98
  - get_all_include, get_all_exclude
99
99
  - create_include, create_exclude
100
100
  - update_include, update_exclude
101
101
 
102
102
  #### 指定模型
103
103
  ```python
104
- from core.crud.api_view import APIView
104
+ from fastgenerateapi import APIView
105
105
 
106
106
  class XxxView(APIView):
107
107
  model_class = XxxModel
@@ -110,7 +110,7 @@ class XxxView(APIView):
110
110
  #### 查询/创建/修改字段限制及校验示例
111
111
  - 如果有唯一字段或者联合唯一字段自动校验是否为唯一值
112
112
  ```python
113
- from core.crud.api_view import APIView
113
+ from fastgenerateapi import APIView
114
114
 
115
115
  class XxxView(APIView):
116
116
  list_schema = HeathInfoList
@@ -126,11 +126,12 @@ class XxxView(APIView):
126
126
  ```python
127
127
  class XxxView(APIView):
128
128
 
129
- def view_路由(self):
129
+ def view_get_user_list(self):
130
130
  """
131
- 文档注释
131
+ 文档Summary注释
132
+ 生成 get方法,路由为 前缀/user_list
132
133
  """
133
- return xxx
134
+ return self.success(data={"list": []})
134
135
  ```
135
136
 
136
137
 
@@ -76,14 +76,14 @@ uvicorn.run(app)
76
76
  - get_one_include, get_one_exclude
77
77
  - 与include同时生效,无include自动包含数据库模型搜友字段
78
78
  - 可添加跨表字段,自动生成校验和文档
79
- - 其他字段: ("test", Optioanl[str], FieldInfo(..., description="文档描述"))
79
+ - 其他字段: ("test", Optional[str], FieldInfo(..., description="文档描述"))
80
80
  - get_all_include, get_all_exclude
81
81
  - create_include, create_exclude
82
82
  - update_include, update_exclude
83
83
 
84
84
  #### 指定模型
85
85
  ```python
86
- from core.crud.api_view import APIView
86
+ from fastgenerateapi import APIView
87
87
 
88
88
  class XxxView(APIView):
89
89
  model_class = XxxModel
@@ -92,7 +92,7 @@ class XxxView(APIView):
92
92
  #### 查询/创建/修改字段限制及校验示例
93
93
  - 如果有唯一字段或者联合唯一字段自动校验是否为唯一值
94
94
  ```python
95
- from core.crud.api_view import APIView
95
+ from fastgenerateapi import APIView
96
96
 
97
97
  class XxxView(APIView):
98
98
  list_schema = HeathInfoList
@@ -108,11 +108,12 @@ class XxxView(APIView):
108
108
  ```python
109
109
  class XxxView(APIView):
110
110
 
111
- def view_路由(self):
111
+ def view_get_user_list(self):
112
112
  """
113
- 文档注释
113
+ 文档Summary注释
114
+ 生成 get方法,路由为 前缀/user_list
114
115
  """
115
- return xxx
116
+ return self.success(data={"list": []})
116
117
  ```
117
118
 
118
119
 
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (1, 2, 1)
11
+ VERSION = (1, 2, 3)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -1,6 +1,8 @@
1
1
  import inspect
2
2
  from typing import Optional, Type, Union, Any
3
3
 
4
+ from pydantic import BaseModel as PydanticBaseModel
5
+
4
6
  from fastapi import Depends
5
7
  from fastapi.security import OAuth2PasswordBearer
6
8
  from fastapi.types import DecoratedCallable
@@ -48,14 +50,7 @@ class CreateView(BaseView, SaveMixin):
48
50
  await self.check_unique_field(data_dict, model_class=self.model_class)
49
51
  await model.save()
50
52
 
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)
55
-
56
- return self.create_response_schema.model_validate(model)
57
-
58
- return
53
+ return model
59
54
 
60
55
  async def set_create_fields(self, request_data, *args, **kwargs) -> dict:
61
56
  """
@@ -94,7 +89,17 @@ class CreateView(BaseView, SaveMixin):
94
89
  *args,
95
90
  **kwargs
96
91
  )
97
- return self.success(data=data)
92
+ if isinstance(data, JSONResponse):
93
+ return data
94
+ if isinstance(data, PydanticBaseModel):
95
+ return self.success(data=data)
96
+ if settings.app_settings.WHETHER_CREATE_RESPONSE_DATA:
97
+ if self.is_with_prefetch:
98
+ data = await self.get_object(data.id, self.model_class, self.is_with_prefetch)
99
+ await self.setattr_model(data, prefetch_related_fields=self.prefetch_related_fields)
100
+
101
+ return self.success(data=self.create_response_schema.model_validate(data))
102
+ return self.success()
98
103
  return route
99
104
 
100
105
  def _handler_create_settings(self):
@@ -109,6 +114,7 @@ class CreateView(BaseView, SaveMixin):
109
114
  self.create_response_schema_factory = response_factory(self.create_response_schema, name="Create")
110
115
  else:
111
116
  self.create_response_schema_factory = self.gen_get_one_response_schema_factory()
117
+ self.create_response_schema = self.get_one_schema
112
118
 
113
119
  doc = self.create.__doc__
114
120
  summary = doc.strip().split("\n")[0] if doc else f"Create"
@@ -124,9 +130,3 @@ class CreateView(BaseView, SaveMixin):
124
130
 
125
131
 
126
132
 
127
-
128
-
129
-
130
-
131
-
132
-
@@ -56,13 +56,12 @@ class DeleteFilterView(BaseView):
56
56
  if self.delete_filter_route:
57
57
  return
58
58
 
59
+ self.delete_filter_response_schema_factory = None
59
60
  func_type = inspect.signature(self.destroy_filter).return_annotation
60
61
  if func_type != inspect._empty and func_type is not None:
61
62
  self.delete_filter_response_schema = func_type
62
63
  if self.delete_filter_response_schema:
63
64
  self.delete_filter_response_schema_factory = response_factory(self.delete_filter_response_schema, name="DeleteFilter")
64
- else:
65
- self.delete_filter_response_schema_factory = self.gen_get_one_response_schema_factory()
66
65
 
67
66
  doc = self.destroy_filter.__doc__
68
67
  summary = doc.strip().split("\n")[0] if doc else "Delete Filter"
@@ -71,7 +70,7 @@ class DeleteFilterView(BaseView):
71
70
  path=path,
72
71
  endpoint=self._delete_filter_decorator(),
73
72
  methods=["DELETE"],
74
- response_model=Optional[self.delete_filter_response_schema_factory],
73
+ response_model=self.delete_filter_response_schema_factory,
75
74
  summary=summary,
76
75
  dependencies=self.delete_filter_route,
77
76
  )
@@ -81,13 +81,12 @@ class DeleteTreeView(BaseView):
81
81
  if self.delete_tree_route:
82
82
  return
83
83
 
84
+ self.delete_tree_response_schema_factory = None
84
85
  func_type = inspect.signature(self.destroy_tree).return_annotation
85
86
  if func_type != inspect._empty and func_type is not None:
86
87
  self.delete_tree_response_schema = func_type
87
88
  if self.delete_tree_response_schema:
88
89
  self.delete_tree_response_schema_factory = response_factory(self.delete_tree_response_schema, name="DeleteTree")
89
- else:
90
- self.delete_tree_response_schema_factory = self.gen_get_one_response_schema_factory()
91
90
 
92
91
  doc = self.destroy_tree.__doc__
93
92
  summary = doc.strip().split("\n")[0] if doc else "Delete Tree"
@@ -96,7 +95,7 @@ class DeleteTreeView(BaseView):
96
95
  path=path,
97
96
  endpoint=self._delete_tree_decorator(),
98
97
  methods=["DELETE"],
99
- response_model=Optional[self.delete_tree_response_schema_factory],
98
+ response_model=self.delete_tree_response_schema_factory,
100
99
  summary=summary,
101
100
  dependencies=self.delete_tree_route,
102
101
  )
@@ -71,13 +71,12 @@ class DeleteView(BaseView):
71
71
  if not self.delete_route:
72
72
  return
73
73
 
74
+ self.delete_response_schema_factory = None
74
75
  func_type = inspect.signature(self.destroy).return_annotation
75
76
  if func_type != inspect._empty and func_type is not None:
76
77
  self.delete_response_schema = func_type
77
78
  if self.delete_response_schema:
78
79
  self.delete_response_schema_factory = response_factory(self.delete_response_schema, name="Delete")
79
- else:
80
- self.delete_response_schema_factory = self.gen_get_one_response_schema_factory()
81
80
 
82
81
  doc = self.destroy.__doc__
83
82
  summary = doc.strip().split("\n")[0] if doc else "Delete All"
@@ -86,7 +85,7 @@ class DeleteView(BaseView):
86
85
  path=path,
87
86
  endpoint=self._delete_decorator(),
88
87
  methods=["DELETE"],
89
- response_model=Optional[self.delete_response_schema_factory],
88
+ response_model=self.delete_response_schema_factory,
90
89
  summary=summary,
91
90
  dependencies=self.delete_route,
92
91
  )
@@ -56,7 +56,7 @@ class GetRelationView(BaseView):
56
56
 
57
57
  async def get_relation(self, pk: str, search: str, filters: dict, relation_filters: dict, *args, **kwargs):
58
58
  relation_queryset = await self.get_relation_queryset(filters=relation_filters, *args, **kwargs)
59
- id_list = relation_queryset.filter(eval(f"Q({self.path_id_name}='{pk}')")).values_list(self.relation_id_name, flat=True)
59
+ id_list = relation_queryset.filter(Q(**{self.path_id_name: pk})).values_list(self.relation_id_name, flat=True)
60
60
 
61
61
  queryset = await self.get_queryset(search=search, filters=filters, *args, **kwargs)
62
62
 
@@ -109,7 +109,7 @@ class GetTreeView(BaseView):
109
109
  top_nodes = [top_node]
110
110
  else:
111
111
  queryset = self.queryset.filter(
112
- eval(f"Q({settings.app_settings.DEFAULT_TREE_PARENT_FIELD + '_id'}={None})")
112
+ Q(**{settings.app_settings.DEFAULT_TREE_PARENT_FIELD + '_id__isnull': True})
113
113
  ).prefetch_related(settings.app_settings.DEFAULT_TREE_PARENT_FIELD)
114
114
 
115
115
  queryset = await self.get_tree_queryset(queryset, search, filters)
@@ -133,9 +133,9 @@ class GetTreeView(BaseView):
133
133
  return queryset
134
134
 
135
135
  async def get_tree_recursion(self, node, search: str, filters: dict,):
136
- data = self.get_tree_schema.from_orm(node)
136
+ data = self.get_tree_schema.model_validate(node)
137
137
  pk = getattr(data, self._get_pk_field(self.model_class))
138
- children_queryset = self.queryset.filter(eval(f"Q({settings.app_settings.DEFAULT_TREE_PARENT_FIELD + '_id'}={pk})"))
138
+ children_queryset = self.queryset.filter(Q(**{settings.app_settings.DEFAULT_TREE_PARENT_FIELD + '_id': pk}))
139
139
  children_queryset = await self.get_tree_queryset(children_queryset, search, filters)
140
140
  children_objs = await children_queryset
141
141
  if not children_objs:
@@ -5,7 +5,7 @@ from fastgenerateapi.pydantic_utils.base_model import BaseModel
5
5
 
6
6
  class SaveMixin:
7
7
 
8
- async def set_save_fields(self, data_dict: dict, *args, **kwargs) -> dict:
8
+ async def set_save_fields(self, data_dict: dict, request_data, *args, **kwargs) -> dict:
9
9
  """
10
10
  添加属性: data_dict['user_id'] = current_user.id
11
11
  kwargs 包含 request_data
@@ -35,7 +35,7 @@ class UpdateRelationView(BaseView, SaveMixin):
35
35
 
36
36
  @atomic()
37
37
  async def update_relation(self, pk: str, request_data, *args, **kwargs):
38
- active_id_list = set(await self.queryset.filter(eval(f"Q({self.path_id_name}='{pk}')")).values_list(
38
+ active_id_list = set(await self.queryset.filter(Q(**{self.path_id_name: pk})).values_list(
39
39
  self._get_pk_field(model_class=self.model_class), flat=True
40
40
  ))
41
41
  add_id_list = set(request_data.id_list) - active_id_list
@@ -75,10 +75,12 @@ class UpdateRelationView(BaseView, SaveMixin):
75
75
  if not self.update_relation_route:
76
76
  return
77
77
 
78
+ self.update_relation_response_schema_factory = None
78
79
  func_type = inspect.signature(self.create).return_annotation
79
80
  if func_type != inspect._empty and func_type is not None:
80
81
  self.update_relation_response_schema = func_type
81
- self.update_relation_response_schema_factory = response_factory(self.update_relation_response_schema, name="UpdateRelation")
82
+ if self.update_relation_response_schema:
83
+ self.update_relation_response_schema_factory = response_factory(self.update_relation_response_schema, name="UpdateRelation")
82
84
 
83
85
  doc = self.update_relation.__doc__
84
86
  summary = doc.strip().split("\n")[0] if doc else f"Update {self.model_class.__name__.title()}"
@@ -1,6 +1,8 @@
1
1
  import inspect
2
2
  from typing import Optional, Type, Union, Any
3
3
 
4
+ from pydantic import BaseModel as PydanticBaseModel
5
+
4
6
  from fastapi import Depends
5
7
  from fastapi.security import OAuth2PasswordBearer
6
8
  from fastapi.types import DecoratedCallable
@@ -32,23 +34,16 @@ class UpdateView(BaseView, SaveMixin):
32
34
  @atomic()
33
35
  async def update(self, pk: str, request_data, *args, **kwargs):
34
36
  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)
37
+ data_dict = await self.set_update_fields(model=model, request_data=request_data, *args, **kwargs)
38
+ data_dict = await self.set_save_fields(data_dict, model=model, request_data=request_data, *args, **kwargs)
37
39
 
38
40
  await self.check_unique_field(data_dict, model_class=self.model_class, model=model)
39
41
  model = await self.set_update_model(model, data_dict, request_data=request_data, *args, **kwargs)
40
42
  await model.save()
41
43
 
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)
45
-
46
- return self.update_response_schema.from_orm(model)
47
-
48
- return
44
+ return model
49
45
 
50
- @staticmethod
51
- async def set_update_fields(request_data, *args, **kwargs):
46
+ async def set_update_fields(self, model, request_data, *args, **kwargs) -> dict:
52
47
  """
53
48
  修改属性:
54
49
  data_dict = request_data.dict(exclude_unset=True)
@@ -86,7 +81,18 @@ class UpdateView(BaseView, SaveMixin):
86
81
  token=token,
87
82
  *args, **kwargs
88
83
  )
89
- return self.success(data=data)
84
+ if isinstance(data, JSONResponse):
85
+ return data
86
+ if isinstance(data, PydanticBaseModel):
87
+ return self.success(data=data)
88
+ if settings.app_settings.WHETHER_UPDATE_RESPONSE_DATA:
89
+ if self.is_with_prefetch:
90
+ await self.setattr_model(data, prefetch_related_fields=self.prefetch_related_fields, *args,
91
+ **kwargs)
92
+
93
+ return self.success(data=self.update_response_schema.model_validate(data))
94
+
95
+ return self.success()
90
96
  return route
91
97
 
92
98
  def _handler_update_settings(self):
@@ -101,6 +107,7 @@ class UpdateView(BaseView, SaveMixin):
101
107
  self.update_response_schema_factory = response_factory(self.update_response_schema, name="Update")
102
108
  else:
103
109
  self.update_response_schema_factory = self.gen_get_one_response_schema_factory()
110
+ self.update_response_schema = self.get_one_schema
104
111
 
105
112
  doc = self.update.__doc__
106
113
  summary = doc.strip().split("\n")[0] if doc else f"Update"
@@ -89,11 +89,15 @@ class BaseFilter:
89
89
  :param value:
90
90
  :return:
91
91
  """
92
+ q_dict = {}
92
93
  if isinstance(value, (str, datetime, date, time)):
93
94
  if hasattr(value, "upper") and value.upper() in ["NONE", "NULL", "NIL"]:
94
- return eval(f"Q({self.model_field}={None})")
95
- return eval(f"Q({self.model_field}='{value}')")
96
- return eval(f"Q({self.model_field}={value})")
95
+ q_dict[self.model_field] = None
96
+ else:
97
+ q_dict[self.model_field] = str(value)
98
+ else:
99
+ q_dict[self.model_field] = value
100
+ return Q(**q_dict)
97
101
 
98
102
  def query(self, queryset: QuerySet, value: Union[str, list, bool]) -> QuerySet:
99
103
  """
@@ -1,6 +1,6 @@
1
1
  from typing import Type, Optional, Union
2
2
 
3
- from pydantic import validator, field_validator
3
+ from pydantic import field_validator
4
4
  from pydantic.fields import FieldInfo
5
5
  from tortoise import Model
6
6
 
@@ -144,7 +144,10 @@ def get_validate_dict_from_fields(fields_info: dict) -> dict:
144
144
  for filed, field_tuple in fields_info.items():
145
145
  if field_tuple[0] == str:
146
146
  method_name = "check_%s" % filed
147
- validator_method = validator(filed, pre=True, allow_reuse=True)(remove_blank_strings)
147
+ # v1
148
+ # validator_method = validator(filed, pre=True, allow_reuse=True)(remove_blank_strings)
149
+ # v2
150
+ validator_method = field_validator(filed, mode='before')(remove_blank_strings)
148
151
  validator_dict[method_name] = validator_method
149
152
  return validator_dict
150
153
 
@@ -108,6 +108,8 @@ class SettingsModel(BaseModel):
108
108
  etcd_settings = EtcdSettings(**data_dict.get("EtcdSettings", {}))
109
109
  if etcd_settings.ETCD_SETTING_KEY:
110
110
  res, metadata = etcd_settings.client.get(etcd_settings.ETCD_SETTING_KEY)
111
+ if not res:
112
+ raise ValidationException("未读取到Etcd的配置文件")
111
113
  data_dict.update(yaml.safe_load(res))
112
114
  if not data_dict:
113
115
  raise ValidationException(errors="配置错误")
@@ -8,7 +8,8 @@ from fastgenerateapi.pydantic_utils.base_settings import BaseSettings
8
8
 
9
9
  class AppSettings(BaseSettings):
10
10
  # 字段配置 驼峰格式:新版本(pydantic.alias_generators:to_camel)、老版本(pydantic.utils.to_lower_camel)
11
- ALIAS_GENERATOR: Optional[str] = Field(default="pydantic.alias_generators.to_snake", description="序列化参数命名方法路径")
11
+ # 下划线:pydantic.alias_generators.to_snake
12
+ ALIAS_GENERATOR: Optional[str] = Field(default="pydantic.alias_generators.to_camel", description="序列化参数命名方法路径")
12
13
 
13
14
  # 分页对应字段以及配置默认值
14
15
  CURRENT_PAGE_FIELD: Optional[str] = Field(default="page", description="当前页字段")
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.1
3
+ Version: 1.2.3
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -94,14 +94,14 @@ uvicorn.run(app)
94
94
  - get_one_include, get_one_exclude
95
95
  - 与include同时生效,无include自动包含数据库模型搜友字段
96
96
  - 可添加跨表字段,自动生成校验和文档
97
- - 其他字段: ("test", Optioanl[str], FieldInfo(..., description="文档描述"))
97
+ - 其他字段: ("test", Optional[str], FieldInfo(..., description="文档描述"))
98
98
  - get_all_include, get_all_exclude
99
99
  - create_include, create_exclude
100
100
  - update_include, update_exclude
101
101
 
102
102
  #### 指定模型
103
103
  ```python
104
- from core.crud.api_view import APIView
104
+ from fastgenerateapi import APIView
105
105
 
106
106
  class XxxView(APIView):
107
107
  model_class = XxxModel
@@ -110,7 +110,7 @@ class XxxView(APIView):
110
110
  #### 查询/创建/修改字段限制及校验示例
111
111
  - 如果有唯一字段或者联合唯一字段自动校验是否为唯一值
112
112
  ```python
113
- from core.crud.api_view import APIView
113
+ from fastgenerateapi import APIView
114
114
 
115
115
  class XxxView(APIView):
116
116
  list_schema = HeathInfoList
@@ -126,11 +126,12 @@ class XxxView(APIView):
126
126
  ```python
127
127
  class XxxView(APIView):
128
128
 
129
- def view_路由(self):
129
+ def view_get_user_list(self):
130
130
  """
131
- 文档注释
131
+ 文档Summary注释
132
+ 生成 get方法,路由为 前缀/user_list
132
133
  """
133
- return xxx
134
+ return self.success(data={"list": []})
134
135
  ```
135
136
 
136
137
 
File without changes