From b79099f7baf104336bfe7fff7a8c57bc451a8d96 Mon Sep 17 00:00:00 2001 From: kanazawa <55349166+wnd-ft@users.noreply.github.com> Date: Sun, 11 Dec 2022 01:48:43 +0900 Subject: [PATCH] Use PrimaryKeyRelatedField pkfield in openapi (#8315) --- rest_framework/schemas/openapi.py | 2 ++ tests/schemas/test_openapi.py | 17 +++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/rest_framework/schemas/openapi.py b/rest_framework/schemas/openapi.py index 840f6977e..ea220c631 100644 --- a/rest_framework/schemas/openapi.py +++ b/rest_framework/schemas/openapi.py @@ -387,6 +387,8 @@ class AutoSchema(ViewInspector): 'items': self.map_field(field.child_relation) } if isinstance(field, serializers.PrimaryKeyRelatedField): + if getattr(field, "pk_field", False): + return self.map_field(field=field.pk_field) model = getattr(field.queryset, 'model', None) if model is not None: model_field = model._meta.pk diff --git a/tests/schemas/test_openapi.py b/tests/schemas/test_openapi.py index e39c9df47..0ea6d1ff9 100644 --- a/tests/schemas/test_openapi.py +++ b/tests/schemas/test_openapi.py @@ -19,6 +19,7 @@ from rest_framework.renderers import ( from rest_framework.request import Request from rest_framework.schemas.openapi import AutoSchema, SchemaGenerator +from ..models import BasicModel from . import views @@ -144,6 +145,22 @@ class TestFieldMapping(TestCase): assert data['properties']['ro_field']['nullable'], "ro_field nullable must be true" assert data['properties']['ro_field']['readOnly'], "ro_field read_only must be true" + def test_primary_key_related_field(self): + class PrimaryKeyRelatedFieldSerializer(serializers.Serializer): + basic = serializers.PrimaryKeyRelatedField(queryset=BasicModel.objects.all()) + uuid = serializers.PrimaryKeyRelatedField(queryset=BasicModel.objects.all(), + pk_field=serializers.UUIDField()) + char = serializers.PrimaryKeyRelatedField(queryset=BasicModel.objects.all(), + pk_field=serializers.CharField()) + + serializer = PrimaryKeyRelatedFieldSerializer() + inspector = AutoSchema() + + data = inspector.map_serializer(serializer=serializer) + assert data['properties']['basic']['type'] == "integer" + assert data['properties']['uuid']['format'] == "uuid" + assert data['properties']['char']['type'] == "string" + @pytest.mark.skipif(uritemplate is None, reason='uritemplate not installed.') class TestOperationIntrospection(TestCase):