Django-rest-framework: OpenAPIスキーマ生成のためにSerializerMethodFieldにフィールドタイプを設定するにはどうすればよいですか?

作成日 2020年01月13日  ·  3コメント  ·  ソース: encode/django-rest-framework

この役に立たないシリアライザーを検討してください。

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に指示する方法がないことです。 私はいくつかの可能性を考えました:

  • Djangoのクエリ式と同様に、 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()
    
  • 単にDRFがサポートしていないものであり、おそらく警告としてどこかに文書化する必要があります。
Enhancement Schema Generation

最も参考になるコメント

私にとって、私が好む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件

こんにちは@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()を宣伝し、文書化します。 それがここに行く正しい方法です。

このページは役に立ちましたか?
0 / 5 - 0 評価