32

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

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"]
}
4

3 に答える 3

50

django rest フレームワークには ListField もあります。 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/

于 2015-01-02T08:57:04.893 に答える
19

非 ORM ベースのオブジェクトの配列を処理する 1 つの方法は、 メソッドto_nativefrom_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

SlugRelatedFieldORM ベースのオブジェクトを持っている場合は、many = True属性で を調べたいと思います。


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

于 2013-07-29T02:02:23.187 に答える
-3

Postgesql を使用している場合は、ArrayFieldを使用できます

于 2015-07-02T16:54:40.960 に答える