From d9dc01c1dc356e4f870c880eeccddfdfa37d594e Mon Sep 17 00:00:00 2001 From: Jimmy Merrild Krag Date: Thu, 16 Jan 2025 22:35:36 +0100 Subject: [PATCH 1/3] Improve schema generation for DictField and HStoreField Make `serializers.DictField` and `serializers.HStoreField` generate objects with `additionalProperties` defined by their `.child`. --- rest_framework/schemas/openapi.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/rest_framework/schemas/openapi.py b/rest_framework/schemas/openapi.py index f35106fe5a..8b0379876e 100644 --- a/rest_framework/schemas/openapi.py +++ b/rest_framework/schemas/openapi.py @@ -500,12 +500,17 @@ def map_field(self, field): 'format': 'binary' } + # Also handles serializers.HStoreField, + if isinstance(field, serializers.DictField): + return { + "type": "object", + "additionalProperties": self.map_field(field.child), + } + # Simplest cases, default to 'string' type: FIELD_CLASS_SCHEMA_TYPE = { serializers.BooleanField: 'boolean', serializers.JSONField: 'object', - serializers.DictField: 'object', - serializers.HStoreField: 'object', } return {'type': FIELD_CLASS_SCHEMA_TYPE.get(field.__class__, 'string')} From 516db9504150717438bc29ff05508a0740c58817 Mon Sep 17 00:00:00 2001 From: Jimmy Merrild Krag Date: Fri, 17 Jan 2025 11:02:33 +0100 Subject: [PATCH 2/3] Support help_text on DictField --- rest_framework/schemas/openapi.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/rest_framework/schemas/openapi.py b/rest_framework/schemas/openapi.py index 8b0379876e..dcf5fb5f5f 100644 --- a/rest_framework/schemas/openapi.py +++ b/rest_framework/schemas/openapi.py @@ -501,11 +501,14 @@ def map_field(self, field): } # Also handles serializers.HStoreField, - if isinstance(field, serializers.DictField): - return { + if isinstance(field, DictField): + schema = { "type": "object", "additionalProperties": self.map_field(field.child), } + if field.help_text: + schema["description"] = field.help_text + return schema # Simplest cases, default to 'string' type: FIELD_CLASS_SCHEMA_TYPE = { From 41ebfe902f535e1c4aed016ea8a940c45a93e6e1 Mon Sep 17 00:00:00 2001 From: Jimmy Merrild Krag Date: Fri, 17 Jan 2025 11:18:31 +0100 Subject: [PATCH 3/3] Fix error --- rest_framework/schemas/openapi.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rest_framework/schemas/openapi.py b/rest_framework/schemas/openapi.py index dcf5fb5f5f..8e89db3c15 100644 --- a/rest_framework/schemas/openapi.py +++ b/rest_framework/schemas/openapi.py @@ -501,7 +501,7 @@ def map_field(self, field): } # Also handles serializers.HStoreField, - if isinstance(field, DictField): + if isinstance(field, serializers.DictField): schema = { "type": "object", "additionalProperties": self.map_field(field.child),