aomaker icon indicating copy to clipboard operation
aomaker copied to clipboard

swagger接口文档生成接口定义时,Model类的名称可以自定义吗; 以及嵌套schema时,用例数据不能自动识别为嵌套的Model类

Open daxiacet opened this issue 6 months ago • 5 comments

  1. schema名称是带版本号的, 生成的Model类名中有版本号信息;如果版本号更新,下次生成的Model就是另外一个了, 导致用例中用到Model类的地方要修改(为什么会用到Model类,见2) —— 请问下,Model类的名称可以在哪自定义规则啊
  2. schema中嵌套schema的情况,比如body中有一个参数Products: List[ProductModel], Products用例数据不能直接用dict,需要用ProductModel来预处理, 不然unstructure_RequestBodyModel时,导致instance.ProductId 提示“AttributeError: 'dict' object has no attribute 'ProductId'”

daxiacet avatar Aug 13 '25 07:08 daxiacet

1.Model类名不支持修改。 原则上不应该用schema名称去做迭代区分,可以放到元数据中或其他地方。 接口定义和依赖模型的迭代管理是下一个版本做的feat。

2.参数中有依赖模型的地方,都需要进行实例化,而不能直接用字典

ae86sen avatar Aug 20 '25 10:08 ae86sen

  1. Model类名自带版本号的,我最后直接改normalize_class_name进行处理了,这样下次生成的时候,model的名称不会变动。 —— 这种是不是可以考虑加一个自定义配置,允许用户进行一定程度的调整

  2. 实例化时,直接用cattrs的Converter可以成功,用aomaker中的Converter会失败,定位到是_register_union_structure_hooks()导致,原因未分析出来(这个也会影响response的结构化,目前我没有用到Union类型的字段,所以本地注释掉了这行代码)

daxiacet avatar Aug 22 '25 09:08 daxiacet

  1. 实例化时,直接用cattrs的Converter可以成功,用aomaker中的Converter会失败,定位到是_register_union_structure_hooks()导致,原因未分析出来

升级到v3.0.2试试

ae86sen avatar Aug 22 '25 09:08 ae86sen

  1. 实例化时,直接用cattrs的Converter可以成功,用aomaker中的Converter会失败,定位到是_register_union_structure_hooks()导致,原因未分析出来

升级到v3.0.2试试

升到v3.0.2了,list[dict]在hook中直接返回了本身,没有先剥离list,再对里面的dict模型化

示例如下:

request_body = {
    "departmentId": "1",
    "cooperationProducts": [
        {
            "promotionProductId": "2501061645230001",
            "sellerId": "72",
        }
    ],
}

@define(kw_only=True)
class Product:
    promotionProductId: Optional[str] = field(default=None)
    sellerId: Optional[str] = field(default=None)


@define(kw_only=True)
class RequestBodyModel:
    departmentId: Optional[str] = field(default=None)
    cooperationProducts: Optional[
        List[Product]
    ] = field(default=None)

from aomaker.core.converters import cattrs_converter
data_converter = cattrs_converter
res = data_converter.structure(request_body, RequestBodyModel)
print(res)
  • 不注释_register_union_structure_hooks(),转出来是RequestBodyModel(departmentId='1', cooperationProducts=[{'promotionProductId': '2501061645230001', 'sellerId': '72'}]);

  • 注释了转出来是RequestBodyModel(departmentId='1', cooperationProducts=[Product(promotionProductId='2501061645230001', sellerId='72')])

daxiacet avatar Aug 26 '25 01:08 daxiacet

已知问题,v3.0.3已修复

ae86sen avatar Aug 26 '25 02:08 ae86sen