この役に立たないシリアライザーを検討してください。
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に指示する方法がないことです。 私はいくつかの可能性を考えました:
serializers.SerializerMethodField(output_field=serializers.IntegerField())
ようなoutput_field
属性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どう思いますか? このアプローチを試す価値はありますか、それとも問題がありますか? 試す価値がある場合は、基本的な型を処理し、ネストされたフィールドを今のところ無視できる基本的なものを取得する価値がありますか、それとも最初から配列とオブジェクトが必要ですか(ネストされているかどうかは関係ありません)。