Skip to content

Commit b79099f

Browse files
authored
Use PrimaryKeyRelatedField pkfield in openapi (#8315)
1 parent 59ae95b commit b79099f

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

rest_framework/schemas/openapi.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -387,6 +387,8 @@ def map_field(self, field):
387387
'items': self.map_field(field.child_relation)
388388
}
389389
if isinstance(field, serializers.PrimaryKeyRelatedField):
390+
if getattr(field, "pk_field", False):
391+
return self.map_field(field=field.pk_field)
390392
model = getattr(field.queryset, 'model', None)
391393
if model is not None:
392394
model_field = model._meta.pk

tests/schemas/test_openapi.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from rest_framework.request import Request
2020
from rest_framework.schemas.openapi import AutoSchema, SchemaGenerator
2121

22+
from ..models import BasicModel
2223
from . import views
2324

2425

@@ -144,6 +145,22 @@ class Meta:
144145
assert data['properties']['ro_field']['nullable'], "ro_field nullable must be true"
145146
assert data['properties']['ro_field']['readOnly'], "ro_field read_only must be true"
146147

148+
def test_primary_key_related_field(self):
149+
class PrimaryKeyRelatedFieldSerializer(serializers.Serializer):
150+
basic = serializers.PrimaryKeyRelatedField(queryset=BasicModel.objects.all())
151+
uuid = serializers.PrimaryKeyRelatedField(queryset=BasicModel.objects.all(),
152+
pk_field=serializers.UUIDField())
153+
char = serializers.PrimaryKeyRelatedField(queryset=BasicModel.objects.all(),
154+
pk_field=serializers.CharField())
155+
156+
serializer = PrimaryKeyRelatedFieldSerializer()
157+
inspector = AutoSchema()
158+
159+
data = inspector.map_serializer(serializer=serializer)
160+
assert data['properties']['basic']['type'] == "integer"
161+
assert data['properties']['uuid']['format'] == "uuid"
162+
assert data['properties']['char']['type'] == "string"
163+
147164

148165
@pytest.mark.skipif(uritemplate is None, reason='uritemplate not installed.')
149166
class TestOperationIntrospection(TestCase):

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy