diff --git a/src/drf_yasg/inspectors/field.py b/src/drf_yasg/inspectors/field.py index 702c8d2..7c5575a 100644 --- a/src/drf_yasg/inspectors/field.py +++ b/src/drf_yasg/inspectors/field.py @@ -72,6 +72,10 @@ class InlineSerializerInspector(SerializerInspector): def get_serializer_ref_name(self, serializer): return get_serializer_ref_name(serializer) + def _has_ref_name(self, serializer): + serializer_meta = getattr(serializer, 'Meta', None) + return hasattr(serializer_meta, 'ref_name') + def field_to_swagger_object(self, field, swagger_object_type, use_references, **kwargs): SwaggerType, ChildSwaggerType = self._get_partial_types(field, swagger_object_type, use_references, **kwargs) @@ -118,6 +122,7 @@ class InlineSerializerInspector(SerializerInspector): # it is better to just remove title from inline models del result.title + setattr(result, '_serializer', serializer) return result if not ref_name or not use_references: @@ -130,8 +135,12 @@ class InlineSerializerInspector(SerializerInspector): actual_serializer = get_serializer_class(getattr(actual_schema, '_serializer', None)) this_serializer = get_serializer_class(field) if actual_serializer and actual_serializer != this_serializer: # pragma: no cover - logger.warning("Schema for %s will override distinct serializer %s because they " - "share the same ref_name", actual_serializer, this_serializer) + explicit_refs = self._has_ref_name(actual_serializer) and self._has_ref_name(this_serializer) + if not explicit_refs: + raise SwaggerGenerationError( + "Schema for %s would override distinct serializer %s because they implicitly share the same " + "ref_name; explicitly set the ref_name atribute on both serializers' Meta classes" + % (actual_serializer, this_serializer)) return openapi.SchemaRef(definitions, ref_name) diff --git a/testproj/snippets/serializers.py b/testproj/snippets/serializers.py index edab075..156bf70 100644 --- a/testproj/snippets/serializers.py +++ b/testproj/snippets/serializers.py @@ -2,7 +2,7 @@ from decimal import Decimal from django.contrib.auth import get_user_model from rest_framework import serializers -from rest_framework.compat import MinValueValidator, MaxLengthValidator +from rest_framework.compat import MaxLengthValidator, MinValueValidator from snippets.models import LANGUAGE_CHOICES, STYLE_CHOICES, Snippet