Use PrimaryKeyRelatedField pkfield in openapi

This commit is contained in:
wnd-ft 2021-12-31 00:32:25 +09:00
parent 5b2abbed25
commit 2a6abd0d2e
2 changed files with 19 additions and 0 deletions

View File

@ -385,6 +385,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

View File

@ -18,6 +18,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
@ -129,6 +130,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):