Skip to content

Commit b7dd585

Browse files
authored
Exclude callable field defaults from the OpenAPI schema (#1167)
* Exclude callable field defaults from the OpenAPI schema * Organize callable default test in line with project standards
1 parent 126cd9f commit b7dd585

File tree

4 files changed

+26
-7
lines changed

4 files changed

+26
-7
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ any parts of the framework not mentioned in the documentation should generally b
5353
* Fixed "id" field being added to /data/attributes in the OpenAPI schema when it is not rendered there.
5454
* Fixed `SerializerMethodResourceRelatedField(many=True)` fields being given
5555
a "reltoone" schema reference instead of "reltomany".
56+
* Callable field default values are excluded from the OpenAPI schema, as they don't resolve to YAML data types.
5657

5758
## [6.0.0] - 2022-09-24
5859

rest_framework_json_api/schemas/openapi.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,7 @@ def map_serializer(self, serializer):
727727
schema["writeOnly"] = True
728728
if field.allow_null:
729729
schema["nullable"] = True
730-
if field.default and field.default != empty:
730+
if field.default and field.default != empty and not callable(field.default):
731731
schema["default"] = field.default
732732
if field.help_text:
733733
# Ensure django gettext_lazy is rendered correctly

tests/schemas/test_openapi.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from rest_framework_json_api.schemas.openapi import AutoSchema
2+
from tests.serializers import CallableDefaultSerializer
3+
4+
5+
class TestAutoSchema:
6+
def test_schema_callable_default(self):
7+
inspector = AutoSchema()
8+
result = inspector.map_serializer(CallableDefaultSerializer())
9+
assert result["properties"]["attributes"]["properties"]["field"] == {
10+
"type": "string",
11+
}

tests/serializers.py

+13-6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1+
from rest_framework_json_api import serializers
12
from rest_framework_json_api.relations import ResourceRelatedField
2-
from rest_framework_json_api.serializers import ModelSerializer
33
from tests.models import (
44
BasicModel,
55
ForeignKeySource,
@@ -9,36 +9,43 @@
99
)
1010

1111

12-
class BasicModelSerializer(ModelSerializer):
12+
class BasicModelSerializer(serializers.ModelSerializer):
1313
class Meta:
1414
fields = ("text",)
1515
model = BasicModel
1616

1717

18-
class ForeignKeySourceSerializer(ModelSerializer):
18+
class ForeignKeySourceSerializer(serializers.ModelSerializer):
1919
target = ResourceRelatedField(queryset=ForeignKeyTarget.objects)
2020

2121
class Meta:
2222
model = ForeignKeySource
2323
fields = ("target",)
2424

2525

26-
class ManyToManySourceSerializer(ModelSerializer):
26+
class ManyToManySourceSerializer(serializers.ModelSerializer):
2727
targets = ResourceRelatedField(many=True, queryset=ManyToManyTarget.objects)
2828

2929
class Meta:
3030
model = ManyToManySource
3131
fields = ("targets",)
3232

3333

34-
class ManyToManyTargetSerializer(ModelSerializer):
34+
class ManyToManyTargetSerializer(serializers.ModelSerializer):
3535
class Meta:
3636
model = ManyToManyTarget
3737

3838

39-
class ManyToManySourceReadOnlySerializer(ModelSerializer):
39+
class ManyToManySourceReadOnlySerializer(serializers.ModelSerializer):
4040
targets = ResourceRelatedField(many=True, read_only=True)
4141

4242
class Meta:
4343
model = ManyToManySource
4444
fields = ("targets",)
45+
46+
47+
class CallableDefaultSerializer(serializers.Serializer):
48+
field = serializers.CharField(default=serializers.CreateOnlyDefault("default"))
49+
50+
class Meta:
51+
fields = ("field",)

0 commit comments

Comments
 (0)