fastgenerateapi 1.2.16__tar.gz → 1.2.18__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 (118) hide show
  1. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/PKG-INFO +1 -1
  2. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/__init__.py +6 -1
  3. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/__version__.py +1 -1
  4. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/base_view.py +3 -2
  5. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/create_view.py +3 -4
  6. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/get_all_view.py +8 -6
  7. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/get_relation_view.py +5 -4
  8. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/get_tree_view.py +2 -2
  9. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/base_mixin.py +5 -3
  10. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/dbmodel_mixin.py +28 -6
  11. fastgenerateapi-1.2.18/fastgenerateapi/api_view/mixin/get_mixin.py +11 -0
  12. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/xlsx_util.py +15 -5
  13. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/update_view.py +2 -3
  14. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/filter_controller.py +28 -11
  15. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/data_type/data_type.py +1 -3
  16. fastgenerateapi-1.2.18/fastgenerateapi/data_type/tortoise_type.py +7 -0
  17. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/fastapi_utils/all.py +1 -0
  18. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/fastapi_utils/tortoise_utils.py +30 -5
  19. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/pydantic_utils/base_model.py +5 -4
  20. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/filter_schema_factory.py +5 -16
  21. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/app_settings.py +2 -2
  22. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/str_util.py +7 -0
  23. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi.egg-info/PKG-INFO +1 -1
  24. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi.egg-info/SOURCES.txt +1 -0
  25. fastgenerateapi-1.2.16/fastgenerateapi/api_view/mixin/get_mixin.py +0 -13
  26. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/LICENSE +0 -0
  27. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/README.md +0 -0
  28. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/__init__.py +0 -0
  29. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/api_view.py +0 -0
  30. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/delete_filter_view.py +0 -0
  31. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/delete_tree_view.py +0 -0
  32. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/delete_view.py +0 -0
  33. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/get_one_view.py +0 -0
  34. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/__init__.py +0 -0
  35. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/response_mixin.py +0 -0
  36. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/save_mixin.py +0 -0
  37. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/tool_mixin.py +0 -0
  38. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/__init__.py +0 -0
  39. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/docx_util.py +0 -0
  40. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/file_util.py +0 -0
  41. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/pdf_util.py +0 -0
  42. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/mixin/utils/zip_util.py +0 -0
  43. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/switch_view.py +0 -0
  44. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/api_view/update_relation_view.py +0 -0
  45. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/cache/__init__.py +0 -0
  46. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/cache/cache_decorator.py +0 -0
  47. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/cache/key_builder.py +0 -0
  48. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/channel/__init__.py +0 -0
  49. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/channel/connection_manager.py +0 -0
  50. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/channel/consumer.py +0 -0
  51. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/channel/websocket_view.py +0 -0
  52. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/__init__.py +0 -0
  53. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/router_controller.py +0 -0
  54. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/rpc_controller.py +0 -0
  55. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/search_controller.py +0 -0
  56. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/controller/ws_controller.py +0 -0
  57. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/data_type/__init__.py +0 -0
  58. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/data_type/mysql_data_type.py +0 -0
  59. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/deps/__init__.py +0 -0
  60. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/deps/filter_params_deps.py +0 -0
  61. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/deps/tree_params_deps.py +0 -0
  62. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/example/__init__.py +0 -0
  63. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/example/models.py +0 -0
  64. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/example/routers.py +0 -0
  65. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/example/schemas.py +0 -0
  66. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/example/views.py +0 -0
  67. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/fastapi_utils/__init__.py +0 -0
  68. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/fastapi_utils/param_utils.py +0 -0
  69. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/fastapi_utils/response_utils.py +0 -0
  70. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/model/__init__.py +0 -0
  71. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/model/base_model.py +0 -0
  72. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/__init__.py +0 -0
  73. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/aes_field.py +0 -0
  74. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/enum_field.py +0 -0
  75. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/pk_field.py +0 -0
  76. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/pwd_field.py +0 -0
  77. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/soft_delete_field.py +0 -0
  78. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/my_fields/validator.py +0 -0
  79. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/pydantic_utils/__init__.py +0 -0
  80. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/pydantic_utils/base_settings.py +0 -0
  81. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/pydantic_utils/json_encoders.py +0 -0
  82. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/__init__.py +0 -0
  83. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/common_function.py +0 -0
  84. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/common_schema_factory.py +0 -0
  85. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/create_schema_factory.py +0 -0
  86. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/get_all_schema_factory.py +0 -0
  87. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/get_one_schema_factory.py +0 -0
  88. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/get_relation_schema_factory.py +0 -0
  89. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/get_tree_schema_factory.py +0 -0
  90. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/response_factory.py +0 -0
  91. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/sql_get_all_schema_factory.py +0 -0
  92. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/schemas_factory/update_schema_factory.py +0 -0
  93. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/__init__.py +0 -0
  94. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/all_settings.py +0 -0
  95. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/db_settings.py +0 -0
  96. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/etcd_settings.py +0 -0
  97. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/file_settings.py +0 -0
  98. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/jwt_settings.py +0 -0
  99. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/otlp_settings.py +0 -0
  100. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/redis_settings.py +0 -0
  101. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/sms_settings.py +0 -0
  102. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/settings/system_settings.py +0 -0
  103. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/__init__.py +0 -0
  104. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/aes.py +0 -0
  105. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/auto_discover.py +0 -0
  106. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/exception.py +0 -0
  107. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/file_utils.py +0 -0
  108. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/pwd_utils.py +0 -0
  109. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/ramdom_utils.py +0 -0
  110. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/snowflake.py +0 -0
  111. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/utils/swagger_to_js.py +0 -0
  112. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/validator/__init__.py +0 -0
  113. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi/validator/validator.py +0 -0
  114. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi.egg-info/dependency_links.txt +0 -0
  115. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/fastgenerateapi.egg-info/top_level.txt +0 -0
  116. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/script/__init__.py +0 -0
  117. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/setup.cfg +0 -0
  118. {fastgenerateapi-1.2.16 → fastgenerateapi-1.2.18}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.16
3
+ Version: 1.2.18
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -25,9 +25,14 @@ from fastgenerateapi.channel.websocket_view import WebsocketView
25
25
  from fastgenerateapi.channel.consumer import Consumer
26
26
 
27
27
  # 模型相关类
28
- from fastgenerateapi.pydantic_utils.base_model import model_config, BaseModel, IdList
28
+ from fastgenerateapi.pydantic_utils.base_model import (
29
+ model_config, BaseModel, PagePydantic, EmptyPydantic, SearchPydantic, IdList, IdResp)
30
+
31
+ # 类型提示
32
+ from fastgenerateapi.data_type.tortoise_type import T_Model
29
33
 
30
34
  # 工具相关
35
+ from fastgenerateapi.controller.filter_controller import FilterUtils
31
36
  from fastgenerateapi.api_view.mixin.utils.docx_util import DocxUtil
32
37
  from fastgenerateapi.api_view.mixin.utils.file_util import FileUtil
33
38
  from fastgenerateapi.api_view.mixin.utils.pdf_util import PdfUtil
@@ -8,7 +8,7 @@
8
8
  # d8888P
9
9
 
10
10
 
11
- VERSION = (1, 2, 16)
11
+ VERSION = (1, 2, 18)
12
12
 
13
13
  __version__ = '.'.join(map(str, VERSION))
14
14
 
@@ -16,6 +16,7 @@ from fastgenerateapi.api_view.mixin.base_mixin import BaseMixin
16
16
  from fastgenerateapi.api_view.mixin.dbmodel_mixin import DBModelMixin
17
17
  from fastgenerateapi.api_view.mixin.response_mixin import ResponseMixin
18
18
  from fastgenerateapi.api_view.mixin.tool_mixin import ToolMixin
19
+ from fastgenerateapi.data_type.tortoise_type import T_Model
19
20
  from fastgenerateapi.schemas_factory import get_one_schema_factory, response_factory
20
21
  from fastgenerateapi.settings.all_settings import settings
21
22
  from fastgenerateapi.utils.exception import NOT_FOUND
@@ -24,7 +25,7 @@ from fastgenerateapi.utils.exception import NOT_FOUND
24
25
  class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
25
26
 
26
27
  prefix: Optional[str] = None # 路由追加后缀
27
- model_class: Optional[Type[Model]] = None # 数据库模型
28
+ model_class: Optional[Type[T_Model]] = None # 数据库模型
28
29
  prefetch_related_fields: Optional[dict] = None
29
30
  is_with_prefetch: Optional[bool] = False
30
31
  response_schema: Optional[Type[BaseModel]] = None # 通用返回序列化
@@ -66,7 +67,7 @@ class BaseView(BaseMixin, ResponseMixin, ToolMixin, DBModelMixin):
66
67
  return self.get_active_queryset(self.relation_model_class)
67
68
 
68
69
  @classmethod
69
- async def get_object(cls, pk, model_class, is_with_prefetch=False):
70
+ async def get_object(cls, pk, model_class: Type[T_Model], is_with_prefetch=False) -> T_Model:
70
71
  queryset = cls.get_active_queryset(model_class).filter(id=pk)
71
72
  if is_with_prefetch:
72
73
  queryset = queryset.prefetch_related(*cls.prefetch_related_fields.keys())
@@ -1,8 +1,6 @@
1
1
  import inspect
2
2
  from typing import Optional, Type, Union, Any
3
3
 
4
- from pydantic import BaseModel as PydanticBaseModel
5
-
6
4
  from fastapi import Depends
7
5
  from fastapi.security import OAuth2PasswordBearer
8
6
  from fastapi.types import DecoratedCallable
@@ -15,7 +13,8 @@ from tortoise.transactions import atomic
15
13
  from fastgenerateapi.api_view.base_view import BaseView
16
14
  from fastgenerateapi.api_view.mixin.save_mixin import SaveMixin
17
15
  from fastgenerateapi.data_type.data_type import DEPENDENCIES
18
- from fastgenerateapi.schemas_factory import get_one_schema_factory, create_schema_factory, response_factory
16
+ from fastgenerateapi.data_type.tortoise_type import T_Model
17
+ from fastgenerateapi.schemas_factory import create_schema_factory, response_factory
19
18
  from fastgenerateapi.settings.all_settings import settings
20
19
 
21
20
 
@@ -64,7 +63,7 @@ class CreateView(BaseView, SaveMixin):
64
63
 
65
64
  return request_data.dict(exclude_unset=True)
66
65
 
67
- async def set_create_model(self, data_dict: dict, request_data, *args, **kwargs) -> Model:
66
+ async def set_create_model(self, data_dict: dict, request_data, *args, **kwargs) -> T_Model:
68
67
  """
69
68
  在数据模型校验前后修改值
70
69
  - 可用于全局修改
@@ -10,7 +10,6 @@ from pydantic import BaseModel
10
10
  from starlette._utils import is_async_callable
11
11
  from starlette.requests import Request
12
12
  from starlette.responses import JSONResponse
13
- from tortoise import Model
14
13
  from tortoise.expressions import Q
15
14
  from tortoise.queryset import QuerySet
16
15
 
@@ -20,6 +19,7 @@ from fastgenerateapi.cache.cache_decorator import get_all_cache_decorator
20
19
  from fastgenerateapi.cache.key_builder import generate_key_builder
21
20
  from fastgenerateapi.controller import SearchController, BaseFilter, FilterController
22
21
  from fastgenerateapi.data_type.data_type import DEPENDENCIES, PYDANTIC_SCHEMA
22
+ from fastgenerateapi.data_type.tortoise_type import T_Model
23
23
  from fastgenerateapi.deps import filter_params_deps
24
24
  from fastgenerateapi.deps.filter_params_deps import search_params_deps, extra_filter_params_deps
25
25
  from fastgenerateapi.pydantic_utils.base_model import PagePydantic
@@ -88,13 +88,15 @@ class GetAllView(BaseView, GetMixin):
88
88
  """
89
89
  return queryset
90
90
 
91
- async def set_get_all_model_list(self, model_list: List[Model], *args, **kwargs) -> List[Model]:
91
+ async def set_get_all_model_list(self, model_list: List[T_Model], *args, **kwargs) -> List[T_Model]:
92
92
  """
93
- 对于查询的model,展示数据处理
93
+ 对于查询的model列表进行数据处理
94
+ 使用场景示例:
95
+ model的某个id通过http请求获取相关信息。此处统一请求,储存在kwargs["extra_filters"]里,在set_get_all_model赋值
94
96
  """
95
97
  return model_list
96
98
 
97
- async def set_get_all_model(self, model: Model, *args, **kwargs) -> Model:
99
+ async def set_get_all_model(self, model: T_Model, *args, **kwargs) -> T_Model:
98
100
  """
99
101
  对于查询的model,展示数据处理
100
102
  """
@@ -225,8 +227,8 @@ class GetAllView(BaseView, GetMixin):
225
227
  def _handler_get_all_settings(self):
226
228
  if not self.get_all_route:
227
229
  return
228
- self.search_controller = SearchController(self.get_base_filter(self.search_fields))
229
- self.filter_controller = FilterController(self.get_base_filter(self.filter_fields, self.filter_schema))
230
+ self.search_controller = SearchController(self.get_base_filter(self.search_fields, model_class=self.model_class))
231
+ self.filter_controller = FilterController(self.get_base_filter(self.filter_fields, self.filter_schema, model_class=self.model_class))
230
232
 
231
233
  func_type = inspect.signature(self.get_all).return_annotation
232
234
  if func_type != inspect._empty and func_type is not None:
@@ -14,6 +14,7 @@ from tortoise.queryset import QuerySet
14
14
  from fastgenerateapi.api_view.base_view import BaseView
15
15
  from fastgenerateapi.controller import SearchController, BaseFilter, FilterController
16
16
  from fastgenerateapi.data_type.data_type import DEPENDENCIES
17
+ from fastgenerateapi.data_type.tortoise_type import T_Model
17
18
  from fastgenerateapi.deps import filter_params_deps
18
19
  from fastgenerateapi.deps.filter_params_deps import search_params_deps
19
20
  from fastgenerateapi.pydantic_utils.base_model import PagePydantic
@@ -100,7 +101,7 @@ class GetRelationView(BaseView):
100
101
  """
101
102
  return queryset
102
103
 
103
- async def set_get_relation_model(self, model: Model) -> Model:
104
+ async def set_get_relation_model(self, model: T_Model) -> T_Model:
104
105
  """
105
106
  对于查询的model,展示数据处理
106
107
  """
@@ -176,9 +177,9 @@ class GetRelationView(BaseView):
176
177
  def _handler_get_relation_settings(self):
177
178
  if not self.get_relation_route:
178
179
  return
179
- self.search_controller = SearchController(self.get_base_filter(self.search_fields))
180
- self.filter_controller = FilterController(self.get_base_filter(self.filter_fields))
181
- self.filter_relation_controller = FilterController(self.get_base_filter(self.relation_filter_fields))
180
+ self.search_controller = SearchController(self.get_base_filter(self.search_fields, model_class=self.model_class))
181
+ self.filter_controller = FilterController(self.get_base_filter(self.filter_fields, model_class=self.model_class))
182
+ self.filter_relation_controller = FilterController(self.get_base_filter(self.relation_filter_fields, model_class=self.model_class))
182
183
 
183
184
  func_type = inspect.signature(self.get_relation).return_annotation
184
185
  if func_type != inspect._empty and func_type is not None:
@@ -178,8 +178,8 @@ class GetTreeView(BaseView):
178
178
  def _handler_get_tree_settings(self):
179
179
  if not self.get_tree_route:
180
180
  return
181
- self.search_controller = SearchController(self.get_base_filter(self.search_fields))
182
- self.filter_controller = FilterController(self.get_base_filter(self.filter_fields))
181
+ self.search_controller = SearchController(self.get_base_filter(self.search_fields, model_class=self.model_class))
182
+ self.filter_controller = FilterController(self.get_base_filter(self.filter_fields, model_class=self.model_class))
183
183
 
184
184
  func_type = inspect.signature(self.get_tree).return_annotation
185
185
  if func_type != inspect._empty and func_type is not None:
@@ -4,6 +4,8 @@ from typing import List, Callable, Any, Union, Optional, Generic, Type
4
4
 
5
5
  from fastapi import APIRouter
6
6
  from fastapi.types import DecoratedCallable
7
+ from tortoise import Model
8
+
7
9
  from fastgenerateapi.utils.exception import NOT_FOUND
8
10
 
9
11
  from fastgenerateapi.controller.filter_controller import BaseFilter
@@ -48,12 +50,12 @@ class BaseMixin(Generic[T], APIRouter, ABC):
48
50
  getattr(self, route_field_func)()
49
51
 
50
52
  @staticmethod
51
- def get_base_filter(fields: list, schema: Optional[PYDANTIC_SCHEMA] = None) -> list:
53
+ def get_base_filter(fields: list, schema: Optional[PYDANTIC_SCHEMA] = None, model_class: Optional[Type[Model]] = None) -> list:
52
54
  bast_filter_list = []
53
55
  if fields:
54
- bast_filter_list += [BaseFilter(field) if not isinstance(field, BaseFilter) else field for field in fields]
56
+ bast_filter_list += [BaseFilter(field, model_class) if not isinstance(field, BaseFilter) else field for field in fields]
55
57
  if schema:
56
- bast_filter_list += [BaseFilter((field, model_field.alias)) for field, model_field in schema.__fields__.items()]
58
+ bast_filter_list += [BaseFilter((field, model_field.alias), model_class) for field, model_field in schema.model_fields.items()]
57
59
  return bast_filter_list
58
60
 
59
61
  @staticmethod
@@ -22,6 +22,10 @@ class DBModelMixin:
22
22
  except:
23
23
  return "id"
24
24
 
25
+ @staticmethod
26
+ def get_model_description(model_class: Optional[Type[Model]]) -> str:
27
+ return model_class._meta.table_description or model_class.__name__
28
+
25
29
  @staticmethod
26
30
  def get_field_description(model_class: Type[Model], fields: Union[str, list, tuple, set]) -> str:
27
31
  if fields in ["id", "pk"]:
@@ -39,10 +43,7 @@ class DBModelMixin:
39
43
  description = ""
40
44
  description += DBModelMixin.get_field_description(model_class=model_class, fields=field_list[0])
41
45
  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
+ description += DBModelMixin.others_description.get(field_list[1], "")
46
47
  else:
47
48
  description += DBModelMixin.get_field_description(
48
49
  model_class=DBModelMixin._get_foreign_key_relation_class(model_class=model_class, field=field_list[0]),
@@ -65,8 +66,29 @@ class DBModelMixin:
65
66
  return ",".join(list(fields))
66
67
 
67
68
  @staticmethod
68
- def get_model_description(model_class: Optional[Type[Model]]) -> str:
69
- return model_class._meta.table_description or model_class.__name__
69
+ def get_model_field_type(model_class: Optional[Type[Model]], field: str) -> type:
70
+ if field in ["id", "pk"]:
71
+ return str
72
+ try:
73
+ field_info = model_class._meta.fields_map.get(field)
74
+ field_info_fk = model_class._meta.fields_map.get(field.removesuffix("_id"))
75
+ if field_info:
76
+ return field_info.field_type
77
+ elif field.endswith("_id") and field_info_fk:
78
+ return str
79
+ elif "__" in field:
80
+ field_list = field.split("__", maxsplit=1)
81
+ if field_list[1] in DBModelMixin.others_description:
82
+ return DBModelMixin.get_model_field_type(model_class, field_list[0])
83
+ else:
84
+ return DBModelMixin.get_model_field_type(
85
+ model_class=DBModelMixin._get_foreign_key_relation_class(model_class=model_class, field=field_list[0]),
86
+ field=field_list[1]
87
+ )
88
+ else:
89
+ return str
90
+ except Exception as e:
91
+ return str
70
92
 
71
93
  @staticmethod
72
94
  def get_model_prefix_name(model_class: Type[Model]) -> str:
@@ -0,0 +1,11 @@
1
+ from fastgenerateapi.data_type.tortoise_type import T_Model
2
+
3
+
4
+ class GetMixin:
5
+
6
+ async def set_get_model(self, model: T_Model, *args, **kwargs) -> T_Model:
7
+ """
8
+ 修改查询后的model数据
9
+ """
10
+ return model
11
+
@@ -89,12 +89,15 @@ class XlsxUtil:
89
89
  model_list: List[Model],
90
90
  fields: List[str],
91
91
  index: Optional[bool] = False,
92
+ model_handler: Callable = None,
92
93
  model_handler_list: List[Callable] = None,
93
94
  fields_handler: dict = None,
94
95
  filename: Optional[str] = '导出文件.xlsx',
95
96
  file_save_path: Optional[str] = None,
96
97
  sheet: Optional[str] = None,
97
98
  model_class: Optional[Model] = None,
99
+ *args,
100
+ **kwargs,
98
101
  ) -> StreamingResponse:
99
102
  """
100
103
  导出excel文件
@@ -102,7 +105,8 @@ class XlsxUtil:
102
105
  :param model_list: 模型列表
103
106
  :param fields: 字段列表
104
107
  :param index: 是否导出序号字段
105
- :param model_handler_list: 模型列表
108
+ :param model_handler: 模型列表的处理方法
109
+ :param model_handler_list: 单个模型处理方法
106
110
  :param fields_handler: 字段处理方法
107
111
  :param filename: 导出文件名
108
112
  :param file_save_path: 指定文件路径保存,不返回
@@ -128,13 +132,19 @@ class XlsxUtil:
128
132
 
129
133
  col_width_list = XlsxUtil.write_headers(sh, headers)
130
134
 
135
+ if model_handler:
136
+ if is_async_callable(model_handler):
137
+ model_list = await model_handler(model_list, *args, **kwargs)
138
+ else:
139
+ model_list = model_handler(model_list, *args, **kwargs)
140
+
131
141
  for row, model in enumerate(model_list, start_row + 1):
132
142
  if model_handler_list:
133
143
  for model_handler in model_handler_list:
134
144
  if is_async_callable(model_handler):
135
- model = await model_handler(model)
145
+ model = await model_handler(model, *args, **kwargs)
136
146
  else:
137
- model = model_handler(model)
147
+ model = model_handler(model, *args, **kwargs)
138
148
  start_col = 1
139
149
  if index:
140
150
  write(sh, row, start_col, str(row-start_row))
@@ -144,9 +154,9 @@ class XlsxUtil:
144
154
  handler = fields_handler.get(field)
145
155
  if handler and hasattr(handler, "__call__"):
146
156
  if is_async_callable(handler):
147
- info = await handler(info)
157
+ info = await handler(info, *args, **kwargs)
148
158
  else:
149
- info = handler(info)
159
+ info = handler(info, *args, **kwargs)
150
160
  write(sh, row, col, info)
151
161
 
152
162
  XlsxUtil.adaptive_format(sh, col_width_list, len(headers))
@@ -1,8 +1,6 @@
1
1
  import inspect
2
2
  from typing import Optional, Type, Union, Any
3
3
 
4
- from pydantic import BaseModel as PydanticBaseModel
5
-
6
4
  from fastapi import Depends
7
5
  from fastapi.security import OAuth2PasswordBearer
8
6
  from fastapi.types import DecoratedCallable
@@ -15,6 +13,7 @@ from tortoise.transactions import atomic
15
13
  from fastgenerateapi.api_view.base_view import BaseView
16
14
  from fastgenerateapi.api_view.mixin.save_mixin import SaveMixin
17
15
  from fastgenerateapi.data_type.data_type import DEPENDENCIES, CALLABLE
16
+ from fastgenerateapi.data_type.tortoise_type import T_Model
18
17
  from fastgenerateapi.pydantic_utils.base_model import BaseModel
19
18
  from fastgenerateapi.schemas_factory import update_schema_factory, get_one_schema_factory, response_factory
20
19
  from fastgenerateapi.settings.all_settings import settings
@@ -56,7 +55,7 @@ class UpdateView(BaseView, SaveMixin):
56
55
 
57
56
  return request_data.dict(exclude_unset=True)
58
57
 
59
- async def set_update_model(self, model: Model, data_dict: dict, *args, **kwargs) -> Model:
58
+ async def set_update_model(self, model: T_Model, data_dict: dict, *args, **kwargs) -> T_Model:
60
59
  """
61
60
  在数据模型校验前后修改值:
62
61
  - 这里修改将不做唯一字段校验
@@ -1,11 +1,13 @@
1
1
  from datetime import datetime, date, time
2
- from typing import Union, Any, Optional
2
+ from typing import Union, Any, Optional, Type
3
3
 
4
4
  from pydantic.fields import FieldInfo
5
+ from tortoise import Model
5
6
  from tortoise.expressions import Q
6
7
  from tortoise.queryset import QuerySet
7
8
 
8
- from fastgenerateapi.settings.all_settings import settings
9
+ from fastgenerateapi.api_view.mixin.dbmodel_mixin import DBModelMixin
10
+ from fastgenerateapi.pydantic_utils.base_model import alias_generator
9
11
 
10
12
 
11
13
  class FilterUtils:
@@ -53,18 +55,20 @@ class BaseFilter:
53
55
  BaseFilter
54
56
  """
55
57
 
56
- def __init__(self, filter_str: Union[str, tuple]):
58
+ def __init__(self, filter_str: Union[str, tuple], model_class: Optional[Type[Model]] = None):
57
59
  """
58
- :param filter_str: Union[str, tuple]
60
+ :param
61
+ filter_str: Union[str, tuple]
59
62
  当tuple时,第一个为str,后面参数无顺序和数量要求,可以是 类型、重命名字符串、用于修改传值的方法
60
- example:
61
- name__contains
62
- (create_at__gt, datetime)
63
- (create_at__gt, datetime, create_time)
64
- (publish_date, datetime, FilterUtils.date_to_datetime_23)
65
- (publish_date, datetime, FieldInfo())
63
+ example:
64
+ name__contains
65
+ (create_at__gt, datetime)
66
+ (create_at__gt, datetime, create_time)
67
+ (publish_date, datetime, FilterUtils.date_to_datetime_23)
68
+ (publish_date, datetime, FieldInfo())
69
+ model_class: 当有值时,会从这里获取到相关的类型和备注
66
70
  """
67
- field_type = str
71
+ field_type = None
68
72
  model_field = filter_str
69
73
  filter_field = None
70
74
  field_info = None
@@ -85,6 +89,19 @@ class BaseFilter:
85
89
  if not filter_field:
86
90
  filter_field = model_field
87
91
 
92
+ if not field_type:
93
+ if model_class:
94
+ field_type = DBModelMixin.get_model_field_type(model_class, model_field)
95
+ else:
96
+ field_type = str
97
+
98
+ if not field_info:
99
+ description = DBModelMixin.get_field_description(model_class, model_field)
100
+ field_info = FieldInfo(default=None, title=description, description=description)
101
+
102
+ if alias_generator:
103
+ field_info.alias = alias_generator(filter_field or model_field)
104
+
88
105
  self.field_type = field_type
89
106
  self.model_field = model_field
90
107
  self.filter_field = filter_field
@@ -1,9 +1,7 @@
1
1
  from typing import Callable, List, Optional, Sequence, TypeVar, Dict, Union, Type
2
2
 
3
3
  from fastapi import Depends
4
-
5
- from fastgenerateapi.pydantic_utils.base_model import BaseModel
6
-
4
+ from pydantic import BaseModel
7
5
 
8
6
  PAGINATION = Dict[str, Optional[int]]
9
7
  PYDANTIC_SCHEMA = BaseModel
@@ -0,0 +1,7 @@
1
+ from typing import TypeVar
2
+
3
+ from tortoise import Model
4
+
5
+ T_Model = TypeVar("T_Model", bound=Model)
6
+
7
+
@@ -2,4 +2,5 @@
2
2
  # 统一导入
3
3
  from .param_utils import *
4
4
  from .response_utils import *
5
+ from .tortoise_utils import *
5
6
 
@@ -1,11 +1,18 @@
1
- from typing import Optional
1
+ from typing import Optional, Any, Literal, Union
2
2
 
3
- from tortoise import BaseDBAsyncClient, connections, transactions
3
+ from tortoise import BaseDBAsyncClient, connections, transactions, fields, ForeignKeyFieldInstance
4
4
  from tortoise.exceptions import ParamsError
5
+ from tortoise.fields import ForeignKeyRelation, CASCADE, OnDelete, ForeignKeyNullableRelation
6
+ from tortoise.models import MODEL
5
7
 
6
8
 
7
9
  def _get_connection(connection_name: Optional[str]) -> BaseDBAsyncClient:
8
- # tortoise-orm==0.25.1
10
+ """
11
+ 修改目的:当多数据库源时,@atomic()有默认的源
12
+ :param connection_name:
13
+ :return:
14
+ """
15
+ # 来源 tortoise-orm==0.25.1
9
16
  # if connection_name:
10
17
  # connection = connections.get(connection_name)
11
18
  # elif len(connections.db_config) == 1:
@@ -21,7 +28,7 @@ def _get_connection(connection_name: Optional[str]) -> BaseDBAsyncClient:
21
28
  connection = connections.get(connection_name)
22
29
  elif len(connections.db_config) >= 1:
23
30
  # 默认选排序第一个
24
- connection_name = next(iter(connections.db_config.keys()))
31
+ connection_name = connections.db_config.get("default") or next(iter(connections.db_config.keys()))
25
32
  connection = connections.get(connection_name)
26
33
  else:
27
34
  raise ParamsError(
@@ -31,9 +38,27 @@ def _get_connection(connection_name: Optional[str]) -> BaseDBAsyncClient:
31
38
  return connection
32
39
 
33
40
 
34
- transactions._get_connection = _get_connection
41
+ def ForeignKeyField(
42
+ model_name: str,
43
+ related_name: Union[str, None, Literal[False]] = None,
44
+ on_delete: OnDelete = CASCADE,
45
+ db_constraint: bool = False,
46
+ null: bool = False,
47
+ **kwargs: Any,
48
+ ) -> Union[ForeignKeyRelation[MODEL], ForeignKeyNullableRelation[MODEL]]:
49
+ """
50
+ 修改内容 db_constraint: bool = False
51
+ 修改目的:取消数据库外键约束
52
+ """
53
+
54
+ return ForeignKeyFieldInstance(
55
+ model_name, related_name, on_delete, db_constraint=db_constraint, null=null, **kwargs
56
+ )
35
57
 
36
58
 
59
+ transactions._get_connection = _get_connection
60
+ fields.ForeignKeyField = ForeignKeyField
61
+
37
62
 
38
63
 
39
64
 
@@ -98,10 +98,6 @@ class PagePydantic(BaseModel):
98
98
  return data
99
99
 
100
100
 
101
- class IdList(BaseModel):
102
- id_list: List[str] = Field([], description="id数组")
103
-
104
-
105
101
  class EmptyPydantic(BaseModel):
106
102
  ...
107
103
 
@@ -110,5 +106,10 @@ class SearchPydantic(BaseModel):
110
106
  search: Optional[str] = Field(None, description="搜索")
111
107
 
112
108
 
109
+ class IdList(BaseModel):
110
+ id_list: List[str] = Field([], description="id数组")
111
+
113
112
 
113
+ class IdResp(BaseModel):
114
+ id: str = Field(..., description="主键")
114
115
 
@@ -1,11 +1,9 @@
1
- from typing import Type, Union, Optional
1
+ from logging import warning
2
+ from typing import Type, Optional
2
3
 
3
- from fastapi import Query
4
4
  from pydantic import BaseModel, create_model
5
- from pydantic.fields import FieldInfo
6
5
 
7
6
  from fastgenerateapi.pydantic_utils.base_model import model_config
8
- from fastgenerateapi.api_view.mixin.dbmodel_mixin import DBModelMixin
9
7
  from fastgenerateapi.controller.filter_controller import BaseFilter
10
8
  from tortoise import Model
11
9
 
@@ -20,8 +18,8 @@ def filter_schema_factory(model_class: Type[Model], fields: list[str, tuple[str,
20
18
 
21
19
  for base_field in fields or []:
22
20
  if not isinstance(base_field, BaseFilter):
23
- base_field = BaseFilter(base_field)
24
- f = base_field.filter_field
21
+ base_field = BaseFilter(base_field, model_class)
22
+ f = base_field.model_field
25
23
  t = base_field.field_type
26
24
  if base_field.field_info:
27
25
  model_fields.update({
@@ -31,16 +29,7 @@ def filter_schema_factory(model_class: Type[Model], fields: list[str, tuple[str,
31
29
  )
32
30
  })
33
31
  else:
34
- description = DBModelMixin.get_field_description(model_class, base_field.model_field)
35
- model_fields.update({
36
- f: (
37
- Optional[t],
38
- FieldInfo(
39
- title=f"{description}",
40
- default=Query("", description=description),
41
- description=f"{description}"
42
- ))
43
- })
32
+ warning(f"模型{model_class.__name__}筛选参数{base_field.model_field}未起效果")
44
33
 
45
34
  filter_params_model: Type[BaseModel] = create_model(
46
35
  model_class.__name__+"CommonFilterParams",
@@ -9,9 +9,9 @@ from fastgenerateapi.pydantic_utils.base_settings import BaseSettings
9
9
  class AppSettings(BaseSettings):
10
10
  # ####################################### 请求参数相关 ###############################################
11
11
  # 字段配置
12
- # 【驼峰格式】 推荐<fastgenerateapi.alias_to_camel> 可选<pydantic.alias_generators.to_snake><会忽略双下划线转单下划线配置>
12
+ # 【驼峰格式】 推荐<fastgenerateapi.alias_to_camel> 可选<pydantic.alias_generators.to_camel><会忽略双下划线转单下划线配置>
13
13
  # 【下划线】<pydantic.alias_generators.to_snake>
14
- ALIAS_GENERATOR: Optional[str] = Field(default=None, description="序列化参数命名方法路径")
14
+ ALIAS_GENERATOR: Optional[str] = Field(default="alias_name", description="序列化参数命名方法路径")
15
15
  # 分页对应字段以及配置默认值
16
16
  WHETHER_PAGE_FIELD: Optional[str] = Field(default="no_page", description="判断是否分页字段")
17
17
  CURRENT_PAGE_FIELD: Optional[str] = Field(default="page", description="当前页字段")
@@ -122,6 +122,13 @@ def alias_to_camel(value: str) -> str:
122
122
  return to_camel(value)
123
123
 
124
124
 
125
+ def alias_name(value: str) -> str:
126
+ if settings.app_settings.FILTER_UNDERLINE_WHETHER_DOUBLE_TO_SINGLE:
127
+ value = value.replace("__", "_")
128
+
129
+ return value
130
+
131
+
125
132
  if __name__ == '__main__':
126
133
  # test parse_str_to_list
127
134
  print(parse_str_to_list("我、你,他,她"))
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fastgenerateapi
3
- Version: 1.2.16
3
+ Version: 1.2.18
4
4
  Summary: FastAPIView Class View
5
5
  Author: ShiLiang
6
6
  Author-email: 2509144896@qq.com
@@ -50,6 +50,7 @@ fastgenerateapi/controller/ws_controller.py
50
50
  fastgenerateapi/data_type/__init__.py
51
51
  fastgenerateapi/data_type/data_type.py
52
52
  fastgenerateapi/data_type/mysql_data_type.py
53
+ fastgenerateapi/data_type/tortoise_type.py
53
54
  fastgenerateapi/deps/__init__.py
54
55
  fastgenerateapi/deps/filter_params_deps.py
55
56
  fastgenerateapi/deps/tree_params_deps.py
@@ -1,13 +0,0 @@
1
- from tortoise import Model
2
-
3
- from fastgenerateapi.pydantic_utils.base_model import BaseModel
4
-
5
-
6
- class GetMixin:
7
-
8
- async def set_get_model(self, model: Model, *args, **kwargs) -> Model:
9
- """
10
- 修改查询后的model数据
11
- """
12
- return model
13
-