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