์ด ์ธ๋ชจ์๋ ์ง๋ ฌ ๋ณํ๊ธฐ๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
class MySerializer(serializers.Serializer):
random_number = serializers.SerializerMethodField()
def get_random_number(self):
# Chosen by fair dice roll.
# Guaranteed to be random.
return 4
์ด ์ง๋ ฌ ๋ณํ๊ธฐ๋ฅผ ๋์ ์ ์ถ๊ฐํ๊ณ OpenAPI ์คํค๋ง๋ฅผ ์์ฑํ๋ค๊ณ ๊ฐ์ ํ๋ฉด ์ง๋ ฌ ๋ณํ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
properties:
random_number:
type: string
required:
- random_number
์ฌ๊ธฐ์ ๋ฌธ์ ๋ ์ฌ๊ธฐ์ type: number
๋ฅผ ์ฌ์ฉํ๋๋ก DRF์ ์ง์ํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์
๋๋ค. ๋ช ๊ฐ์ง ๊ฐ๋ฅ์ฑ์ ์๊ฐํ์ต๋๋ค.
output_field
์์ฑ(์ serializers.SerializerMethodField(output_field=serializers.IntegerField())
)์ Django์ ์ฟผ๋ฆฌ ํํ์ ๊ณผ ์ ์ฌํฉ๋๋ค.openapi_type(serializers.SerializerMethodField(), serializers.IntegerField())
์ ๊ฐ์ ๋ฐ์ฝ๋ ์ดํฐ๊ด๋ฆฌ์ ์์ ์ ๋ํ ์ค๋ช ์ค์ ๊ณผ ์ ์ฌํ ์์ฑ:
random_number = serializers.SerializerMethodField()
def get_random_number(self):
return 4
get_random_number.output_field = serializers.IntegerField()
์๋ ํ์ธ์ @Lucidiot์ ๋๋ค.
์ด๋ฅผ ์ํํ๋ ์ฆ๊ฐ์ ์ธ ๋ฐฉ๋ฒ์ AutoSchema._map_field()
์ฌ์ ์ํ๋ ๊ฒ์
๋๋ค.
ํด๋น ํ๋๋ฅผ ์์ํ๊ธฐ ์ํด ์ง๋ ฌ ๋ณํ๊ธฐ/๋ณด๊ธฐ๋ณ๋ก ์ํํ๊ฑฐ๋ ๋งํ ๋๋ก ์์ฑ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๊ฒฐ๊ตญ ์ด๋ฐ ์์ผ๋ก ๋ญ๊ฐ๋ฅผ ์ฐพ๊ฒ ๋ ๊ฒ์ด์ง๋ง, ํ์ฌ๋ก์๋ API ์ธก๋ฉด์์ ์ต์ ์ ์ ํ์ด ๋ฌด์์ธ์ง ํ์ ํ ์ ์์ต๋๋ค.
์ ์๊ฒ ์์ด ์ ํธํ๋ API๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ ํํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
def get_foo(self, obj) -> int:
return 1
ํ์ฌ ์ง์๋๋ ๋ชจ๋ Python ๋ฒ์ ์์ ์๋ํฉ๋๋ค. ์ด ์์ด๋์ด๋ https://github.com/encode/django-rest-framework/pull/7089 ์์ ์ฌ์ฉ๋์์ง๋ง ๋ค๋ฅธ PR๋ก ๋ถ๋ฆฌ๋์ง ์์์ต๋๋ค. ๊ทธ ๊ตฌํ์ ๋ณด๋ฉด ์ปฌ๋ ์
์ ์ฒ๋ฆฌํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค. ์ด๋ค ์์ ์์๋ ์ค์ฒฉ๋ ์ง๋ ฌ ๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ง๋ง List[int]
, List[str]
, Dict[str, int]
๋ฑ๊ณผ ๊ฐ์ ๊ฐ๋จํ ๊ฒฝ์ฐ๊ฐ ์ง์๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@carlfarrington ์ด๋ป๊ฒ ์๊ฐํ์ธ์? ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๊น? ์๋๋ฉด ๋ฌธ์ ๊ฐ ์์ต๋๊น? ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์๋ค๋ฉด ๊ธฐ๋ณธ ์ ํ์ ์ฒ๋ฆฌํ๊ณ ์ค์ฒฉ ํ๋๋ฅผ ๋ฌด์ํ ์ ์๋ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ ์ป์ ๊ฐ์น๊ฐ ์์ต๋๊น? ์๋๋ฉด ์ฒ์๋ถํฐ ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ฅผ ์ํ ๊น์(์ค์ฒฉ ์ฌ๋ถ)?
3.12์์ map_field()
๋ฅผ ํ๋ณดํ๊ณ ๋ฌธ์ํํฉ๋๋ค. ์ฌ๊ธฐ๋ก ๊ฐ๋ ๊ธธ์ด ๋ง์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ์๊ฒ ์์ด ์ ํธํ๋ API๋ ๋ค์๊ณผ ๊ฐ์ ์ ํ ํํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
ํ์ฌ ์ง์๋๋ ๋ชจ๋ Python ๋ฒ์ ์์ ์๋ํฉ๋๋ค. ์ด ์์ด๋์ด๋ https://github.com/encode/django-rest-framework/pull/7089 ์์ ์ฌ์ฉ๋์์ง๋ง ๋ค๋ฅธ PR๋ก ๋ถ๋ฆฌ๋์ง ์์์ต๋๋ค. ๊ทธ ๊ตฌํ์ ๋ณด๋ฉด ์ปฌ๋ ์ ์ ์ฒ๋ฆฌํ์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ ๋๋ค. ์ด๋ค ์์ ์์๋ ์ค์ฒฉ๋ ์ง๋ ฌ ๋ณํ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ข์ง๋ง
List[int]
,List[str]
,Dict[str, int]
๋ฑ๊ณผ ๊ฐ์ ๊ฐ๋จํ ๊ฒฝ์ฐ๊ฐ ์ง์๋์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.@carlfarrington ์ด๋ป๊ฒ ์๊ฐํ์ธ์? ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์์ต๋๊น? ์๋๋ฉด ๋ฌธ์ ๊ฐ ์์ต๋๊น? ์๋ํด ๋ณผ ๊ฐ์น๊ฐ ์๋ค๋ฉด ๊ธฐ๋ณธ ์ ํ์ ์ฒ๋ฆฌํ๊ณ ์ค์ฒฉ ํ๋๋ฅผ ๋ฌด์ํ ์ ์๋ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ ์ป์ ๊ฐ์น๊ฐ ์์ต๋๊น? ์๋๋ฉด ์ฒ์๋ถํฐ ๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ฅผ ์ํ ๊น์(์ค์ฒฉ ์ฌ๋ถ)?