openapi-generator
openapi-generator copied to clipboard
[BUG] [Python] oneOf not using the discriminator
Bug Report Checklist
- [x] Have you provided a full/minimal spec to reproduce the issue?
- [x] Have you validated the input using an OpenAPI validator (example)?
- [x] Have you tested with the latest master to confirm the issue still exists?
- [x] Have you searched for related issues/PRs?
- [x] What's the actual output vs expected output?
- [ ] [Optional] Sponsorship to speed up the bug fix or feature request (example)
Description
We have an endpoint that returns a oneOf
response, using a discriminator field.
It seems the generated code tries to parse the JSON as every object in the oneOf
, and counts matches. The problem here is that, in our case, it manages to parse for both Product
and ServerProduct
, resulting in an error being thrown.
Instead, we expect that the discriminator field is used in order to parse the response as the correct type - using the propertyName
and mappings as shown below.
In addition, the discriminator_value_class_map
seems to be empty (despite us having discriminators) and unused.
If it helps, all of this is generated correctly (aka, using the discriminator) in both Go and Ruby.
openapi-generator version
7.2.0
OpenAPI declaration file content or url
responses:
'200':
description: List of all the products.
content:
application/json:
schema:
type: array
items:
oneOf:
- $ref: '#/components/schemas/Product'
- $ref: '#/components/schemas/ServerProduct'
discriminator:
propertyName: productCategory
mapping:
SERVER: '#/components/schemas/ServerProduct'
BANDWIDTH: '#/components/schemas/Product'
OPERATING_SYSTEM: '#/components/schemas/Product'
STORAGE: '#/components/schemas/Product'
PUBLIC_IP: '#/components/schemas/Product'
Generation Details
Here we're generating a Python SDK, using this command:
openapi-generator-cli generate -i ${{ inputs.spec-link }} -c openapi-generator-config.yaml -o=${{ inputs.package-name }} --additional-properties packageName=${{ inputs.package-name }}
Here's the config:
generatorName: python
ignoreFileOverride: ".openapi-generator-ignore"
templateDir: "template"
In this case, we're not overriding the generation of oneOf
models with our template, so we're using the default.
Steps to reproduce
- Generate an SDK that has an endpoint which returns a
oneOf
model, where all options are similar (or identical for testing purposes). - Attempt to call that endpoint using the SDK (can use a mock server)
- Get a similar error to this:
ValueError: Multiple matches found when deserializing the JSON string into ProductsGet200ResponseInner with oneOf schemas: Product, ServerProduct. Details:
Related issues/PRs
Couldn't find any, unfortunately.
Suggest a fix
The fix in this case would be to update the template for the model_oneof.mustache
so that it utilises the discriminator instead.
The discriminator_value_class_map
can be used here, but it should be fixed so that the map is generated correctly. I don't know how to fix this or use the actual discriminator values.
Have you tried the following config?
useOneOfDiscriminatorLookup: true