# newbee **Repository Path**: yoopaa/newbee ## Basic Information - **Project Name**: newbee - **Description**: django框架的一个非常好用的库,只需要在你app中model.py简单的配置,就可以自动生成API接口 - **Primary Language**: Python - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-02 - **Last Updated**: 2022-10-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Django_NEWBEE_AUTOAPI #### 介绍 django框架的一个非常好用的库,只需要在你app中model.py简单的配置,就可以自动生成API接口 #### 安装教程 ##### 本人的python版本 ``` % python -V Python 3.6.2 ``` ##### 需要安装的其他库 ``` % pip list Django (3.0.6) djangorestframework (3.11.0) pycryptodome (3.9.7) ``` 1. 将newbee文件夹 放到你django项目根目录 2. 在你django项目 settings.py 文件 设置INSTALLED_APPS 添加一项 `newbee` 3. newbee/newbee_middleware/DataTransMiware.py 是一个全局请求体(响应体)加密中间件, 你可以在你的django项目 settings.py 文件 设置 MIDDLEWARE 添加一项 `'newbee.newbee_middleware.DataTransMiware.DTMiddleware'` 一定要放到最后 并在你的 Django项目 根目录 创建一个 `sing_key`文件 里面填写32个字符 (16位数字字符串组成) `示例: d86d7bab3d6ac01ad9dc6a897652f2dd` 4. newbee/newbee_util/pro_log.py 是django项目日志记录器, 请你在settings中设置logger, 详细代码在 pro_log.py 注释中 至此 newbee 已经安装完毕 #### 使用说明 ##### 以下操作都在你app models.py 文件中完成配置 # 1. 允许模型使用NEWBEE自动生成API: 引入`from newbee import newbee_model`, 接着, 在你的模型类之前加上装饰器 `@newbee_model.decorator_factory()` 详细参数见下表格 # | 参数名 | 类型 | 说明 | 默认值 | 示例 | |:----------|:----------|:----------|:----------|:----------| | newbee\_can\_delete | boolean | 指定该模型是否允许删除 | False | True | | newbee\_can\_add | boolean | 指定该模型是否允许增加 | True | True | | newbee\_can\_update | boolean | 指定该模型是否允许修改 | True | True | | newbee\_can\_find | boolean | 指定该模型是否允许查询 | True | True | | newbee\_action | String | 前端url传参传递的action | 模型名的全小写: `model.__name__.lower()` | action | | newbee\_add\_default\_dict | dict {key: function} | 执行增加操作时, 默认增加的项, 注意事项: value一定是个带request参数的方法 | {} | `{"number": lambda request: get_random_number}` | | newbee\_update\_default\_dict | dict {key: function} | 执行修改操作时, 默认增加的项, 注意事项: value一定是个带request参数的方法 | {} | `{"number": lambda request: get_random_number}` | | newbee\_find\_default\_dict | dict {key: function} | 执行修改操作时, 默认增加的项, 注意事项: value一定是个带request参数的方法 | {`"is_deleted": lambda request: False}` | `{"is_deleted": lambda request: False}` | | newbee\_find\_return\_key | String | 执行查询操作成功后, 返回的data字典, 查询到所有数据的key值 | action加"\_list" | actions | | newbee\_find\_parent\_field\_dict\_list | list `[["查询成功后, 返回时的key", "字段名(通过obj.?查询, 填?的值)", ["parent对象的字段名1", "parent对象的字段名2"]],]` | 在执行查询操作时 有字段为关联字段(Foreign or OneToOne or ManyToMany) 把关联字段写进去 你将会查询此条记录关于这些字段所有的parent | [] | `[["parent", "parent", ["id", "name", "path", "icon", "component"]]]` | | newbee\_find\_child\_field\_dict\_list | list `[["查询成功后, 返回时的key", "字段名(通过obj.?查询, 填?的值)", ["child对象的字段名1", {"返回的key": obj.__dict__[?]}, "child对象的字段名2"]],]` | 在执行查询操作时 有字段为关联字段(ReForeign or ReOneToOne or ReManyToMany) 把关联字段写进去 你将会查询此条记录关于这些字段所有的child | [] | `[[["children", "pid\_set", ["name", "path", "icon", "component"]]]]` | | newbee\_find\_for\_write\_default\_dict | dict | 执行修改操作时, 需要查询到对象才能进行, 此项就是配置此时查询对象字典的默认值 | `{"id": lambda request: get_request_body_dict(request).get("id"), "is_deleted": lambda request: False}` | | | newbee\_find\_for\_delete\_default\_dict | dict | 执行删除操作时, 需要查询到对象才能进行, 此项就是配置此时查询对象字典的默认值 | `{"id": lambda request: get_request_body_dict(request).get("id")}` | | | newbee\_write\_success\_return\_data\_form | dict `{"返回的key": {"增加(修改)后对象中字段的返回key": "增加(修改)后对象中字段名"}}` | 修改和增加成功后, 返回到前端的data格式 | `{"is_deleted": lambda request: False}` | `{"is_deleted": lambda request: True}` | | newbee\_if\_find\_dict\_none | dict | 执行查询操作时, 如果前端什么都没有传递, 默认的查询字典是? | {} | `{"pid": lambda request: None}` | | newbee\_find\_id\_key | String | 查询成功时,返回的id key 默认是id | "id" | `key` | | newbee\_find\_add\_dict\_list | list [{"要返回的key": `obj.__dict__[?]`}] | 查询成功时,返回前端增加的项 | [] | `[{"key": "id"}]` | | newbee\_add\_re\_realte\_dict\_list | list [{"前端发送的key": `找到model的key`}] | 新增时, 允许反向增加关联字段 | [] | `[{"area_ids": "area_set"}]` | | newbee\_update\_re\_realte\_dict\_list | list [{"前端发送的key": `找到model的key`}] | 修改时, 允许反向修改关联字段 | [] | `[{"area_ids": "area_set"}]` | 2. 普通字段使用NEWBEE自定义API请求及响应: 使用`newbee_model.NewBee**Field()` 增加的参数 见 下表格 # | 参数名 | 类型 | 说明 | 默认值 | 示例 | |:----------|:----------|:----------|:----------|:----------| | `new_bee_request_key` | String | 需要前端传值的key | 字段名 | name | | `new_bee_response_key` | String | 返回前端传值的key | 字段名 | name | | `new_bee_can_add` | boolean | 前端请求增加记录时, 是否允许传递此参数 | False | True | | `new_bee_create_key` | String | 增加操作进行数据库操作时 `对象.create(**{"?": value})` | | name | | `new_bee_can_update` | boolean | 前端请求修改记录时, 是否允许传递此参数 | False | True | | `new_bee_update_key` | String | 增加修改进行数据库操作时 `对象.update(**{"?": value})` | | name | | `new_bee_can_found` | boolean | 前端请求查询记录时, 是否允许查询此字段 | False | True | | `new_bee_can_find_by_self` | boolean | 前端请求查询记录时, 是否允许前端使用该字段进行搜索 | False | True | | `new_bee_find_by_self_key` | String | 查询记录时, 组成的查询字典中的key | | name__icontains | 3. related字段(关联字段)使用NEWBEE自定义API请求及响应: 你需要把之前`django.db.models.**()` 替换成 `newbee_model.NewBee**()` 增加的参数 见下表格 # | 参数名 | 类型 | 说明 | 默认值 | 示例 | |:----------|:----------|:----------|:----------|:----------| | `new_bee_request_key` | String | 需要前端传值的key | 字段名 | name | | `new_bee_response_key` | String | 返回前端传值的key | 字段名 | name | | `new_bee_can_add` | boolean | 前端请求增加记录时, 是否允许传递此参数 | False | True | | `new_bee_is_add_tran` | boolean | 前端请求增加记录时, 是否必须传递此参数 | False | True | | `new_bee_add_key` | String | 增加操作进行数据库操作时 `对象.create(**{"?": value})` | | name | | `new_bee_can_update` | boolean | 前端请求修改记录时, 是否允许传递此参数 | False | True | | `new_bee_update_key` | String | 增加修改进行数据库操作时 `对象.update(**{"?": value})` | | name | | `new_bee_can_found` | boolean | 前端请求查询记录时, 是否允许查询此字段 | False | True | | `new_bee_can_find_by_self` | boolean | 前端请求查询记录时, 是否允许前端使用该字段进行搜索 | False | True | | `new_bee_find_by_self_key` | String | 查询记录时, 组成的查询字典中的key | | name__icontains | ##### 至此 你配置的模型已经为您生成了API, 你只需配置url 及 view, 让NEWBEE生成的API代理请求即可 1. 在你urls.py文件中配置路由 `path('', views.NormalView.as_view()),` 2. 在你app views.py中配置视图 示例如下: ``` from rest_framework.response import Response from rest_framework.views import APIView from newbee.newbee_util.crud import find_util, add_util, update_util, delete_util class NormalView(APIView): def get(self, request, action): return Response(*find_util(request, action)) def post(self, request, action): return Response(*add_util(request, action)) def put(self, request, action): return Response(*update_util(request, action)) def delete(self, request, action): return Response(*delete_util(request, action)) ``` ### 示例 ``` #models.py @newbee_model.decorator_factory(newbee_can_delete=True, newbee_find_return_key='companys', newbee_find_child_field_dict_list=[ ["children", "pid_set", ["id", "name"]] ], newbee_write_success_return_data_form={ "company": { "id": "id", "name": "name", "charge_person": "charge_person", "address": "address", "email": "email", "remark": "remark", "pid": "p_id", } }) class Company(newbee_model.NewBeeBaseModel): p = newbee_model.NewBeeForeignKey(new_bee_request_key='pid', new_bee_can_add=True, new_bee_create_key="p_id", new_bee_can_find_by_self=True, new_bee_can_update=True, new_bee_update_key="p_id", new_bee_find_by_self_key='p_id', to="self", db_column="p_id", null=True, on_delete=models.CASCADE, help_text="父亲id", related_name='pid_set')) # 如果要在查询中返回children(自关联child, 或被关联的模型, 请你设置 # related_name name = newbee_model.NewBeeCharField(new_bee_request_key='name', new_bee_response_key='name', new_bee_can_find_by_self=True, new_bee_find_by_self_key='name__icontains', new_bee_can_found=True, new_bee_can_add=True, new_bee_add_key='name', new_bee_can_update=True, new_bee_update_key='name', db_column="name", max_length=48, null=False, help_text="name") charge_person = newbee_model.NewBeeCharField(new_bee_request_key='charge_person', new_bee_response_key='charge_person', new_bee_can_find_by_self=True, new_bee_find_by_self_key='charge_person__icontains', new_bee_can_found=True, new_bee_can_add=True, new_bee_add_key='charge_person', new_bee_can_update=True, new_bee_update_key='charge_person', db_column="charge_person", max_length=48, null=True, help_text="charge_person") address = newbee_model.NewBeeCharField(new_bee_request_key='address', new_bee_response_key='address', new_bee_can_find_by_self=True, new_bee_find_by_self_key='address__icontains', new_bee_can_found=True, new_bee_can_add=True, new_bee_add_key='address', new_bee_can_update=True, new_bee_update_key='address', db_column="address", max_length=48, null=True, help_text="address") email = newbee_model.NewBeeEmailField(new_bee_request_key='email', new_bee_response_key='email', new_bee_can_find_by_self=True, new_bee_find_by_self_key='email', new_bee_can_found=True, new_bee_can_add=True, new_bee_add_key='email', new_bee_can_update=True, new_bee_update_key='email', db_column="email", null=True, help_text="email") remark = newbee_model.NewBeeCharField(new_bee_request_key='remark', new_bee_response_key='remark', new_bee_can_find_by_self=False, new_bee_can_found=True, new_bee_can_add=True, new_bee_add_key='remark', new_bee_can_update=True, new_bee_update_key='remark', db_column="remark", max_length=48, null=True, help_text="remark") class Meta: db_table = "company" ``` ``` #models.py # 菜单 @newbee_model.decorator_factory( newbee_can_add=False, newbee_find_return_key='menu' ) class Menu(newbee_model.NewBeeBaseModel): path = newbee_model.NewBeeCharField( new_bee_can_found=True, db_column="path", max_length=48, null=True, help_text="path" ) icon = newbee_model.NewBeeCharField( new_bee_can_found=True, db_column="icon", max_length=48, null=True, help_text="icon" ) name = newbee_model.NewBeeCharField(new_bee_can_found=True, db_column="name", max_length=48, null=True, help_text="name") component = newbee_model.NewBeeCharField(new_bee_can_found=True, db_column="component", max_length=48, null=True, help_text="component") desc = newbee_model.NewBeeCharField(db_column="desc", max_length=64, null=True, help_text="菜单描述") pid = newbee_model.NewBeeForeignKey(to="self", null=True, on_delete=models.CASCADE, help_text="父亲id", related_name='pid_set') jwt_users = newbee_model.NewBeeManyToManyField(to=JWTUser) # 和jwtUser 是 多对多关系 class Meta: db_table = "menu" ``` ### 参与贡献 #### 马守越--北京市优位智停科技公司