1
votes

I'm trying to force dry-yasg to properly parse parameters from path. Let's say we have

path('users/<int:user_id>/', whatever.as_view(...))

In swagger docs it is not treated as int, but string instead

enter image description here

I have used

swagger_auto_schema(manual_parameters = [
openapi.Parameter(
        name,
        openapi.IN_PATH,
        description=desc,
        type=openapi.TYPE_INTEGER,
        required=True
    )
]

but it's pretty annoying. I could not find a function/method/class responsible for parsing that. Is there a simple method to change behaviour of this parser based on path, so that if int occurs then openapi.TYPE_INTEGER will be returned instead of string?

1
Your anwser helped me fix another problem I was having .. thank you. In the future, try to add the imports to your files to help others.jarussi

1 Answers

2
votes

determines the parameter type automatically in some situations, and falls back on string if detection fails.

queryset = get_queryset_from_view(view_cls)

for variable in sorted(uritemplate.variables(path)):
    model, model_field = get_queryset_field(queryset, variable)
    attrs = get_basic_type_info(model_field) or {'type': openapi.TYPE_STRING}

As you can see, it tries to get type based on column type of view queryset. If your parameter name doesn't match anything in the queryset though, you get a string. So your first choice should be to try use a name it can autodetect.

If that doesn't work however, you will need to subclass EndpointEnumerator and override get_path_parameters(), probably easiest to call super().get_path_parameters() and go though each parameter and replace type based on variable name.

To use this class you will need your own OpenAPISchemaGenerator.

  • use a custom OpenAPISchemaGenerator
  • override its endpoint_enumerator_class with your own EndpointEnumerator