Skip to content

Commit cd65921

Browse files
committed
Use PrimaryKeyRelatedField pkfield in openapi
1 parent 5b2abbe commit cd65921

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
@@ -385,6 +385,8 @@ def map_field(self, field):
385385
'items': self.map_field(field.child_relation)
386386
}
387387
if isinstance(field, serializers.PrimaryKeyRelatedField):
388+
if getattr(field, "pk_field", False):
389+
return self.map_field(field=field.pk_field)
388390
model = getattr(field.queryset, 'model', None)
389391
if model is not None:
390392
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.schemas.openapi import AutoSchema, SchemaGenerator
2020

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

2324

2425
def create_request(path):
@@ -129,6 +130,22 @@ class Meta:
129130
assert data['properties']['ro_field']['nullable'], "ro_field nullable must be true"
130131
assert data['properties']['ro_field']['readOnly'], "ro_field read_only must be true"
131132

133+
def test_primary_key_related_field(self):
134+
class PrimaryKeyRelatedFieldSerializer(serializers.Serializer):
135+
basic = serializers.PrimaryKeyRelatedField(queryset=BasicModel.objects.all())
136+
uuid = serializers.PrimaryKeyRelatedField(queryset=BasicModel.objects.all(),
137+
pk_field=serializers.UUIDField())
138+
char = serializers.PrimaryKeyRelatedField(queryset=BasicModel.objects.all(),
139+
pk_field=serializers.CharField())
140+
141+
serializer = PrimaryKeyRelatedFieldSerializer()
142+
inspector = AutoSchema()
143+
144+
data = inspector.map_serializer(serializer=serializer)
145+
assert data['properties']['basic']['type'] == "integer"
146+
assert data['properties']['uuid']['format'] == "uuid"
147+
assert data['properties']['char']['type'] == "string"
148+
132149

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

0 commit comments

Comments
 (0)