web-dev-qa-db-ja.com

Django restフレームワークでリストフィールドを定義するにはどうすればよいですか?

クラスがあるとしましょう

class Tags(object):

    tags = []

    def __init__(self, tags):
        self.tags = tags

およびカスタムリストフィールド

class TagsField(serializers.WritableField):
    """
    Returns a list of tags, or serializes a list of tags
    """

ここからどこに行くかわからない。ブログ投稿シリアライザーが次のように定義されていることを確認するにはどうすればよいですか?

class BlogPostSerializer(serializers.Serializer):
    post = CharField()
    tags = TagsField

私に似たjsonオブジェクトを与えます

{
    "post": "Here is my blog post about python",
    "tags": ["python", "Django", "rest"]
}
26
user1876508

ORMベースでないオブジェクトのarraysを処理する1つの方法は、to_nativeおよびfrom_nativeメソッドをオーバーライドすることです。あなたの場合:

class TagsField(serializers.WritableField):

    def from_native(self, data):
        if isinstance(data, list):
            return Tags(data)
        else:
            msg = self.error_messages['invalid']
            raise ValidationError(msg)

    def to_native(self, obj):
        return obj.tags

ORMベースのオブジェクトがある場合は、many = True属性を使用してSlugRelatedFieldを確認します。


Django Rest Frameworkバージョン3.0では、ListFieldも使用できます http://www.Django-rest-framework.org/api-guide/fields/#listfield

18
sebastibe

Django restフレームワーク、 http://www.Django-rest-framework.org/api-guide/fields/#listfield を参照してください。

例で:

scores = serializers.ListField(
    child=serializers.IntegerField(min_value=0, max_value=100)
)

および(その他の表記):

class StringListField(serializers.ListField):
    child = serializers.CharField()

これは簡単に思えます(このクラスは受け入れられたanwserよりも後で追加されるかもしれませんが、とにかくこのオプションを追加するのが良いようです)

ちなみに、それはdjang rest framework 3.0以降に追加されました: http://www.Django-rest-framework.org/topics/3.0-announcement/

43
michel.iamit