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

+2
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

+17
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)