如何在django rest框架中定义列表字段?

use*_*508 27 django json field list django-rest-framework

假设我有一堂课

class Tags(object):

    tags = []

    def __init__(self, tags):
        self.tags = tags
Run Code Online (Sandbox Code Playgroud)

和自定义列表字段

class TagsField(serializers.WritableField):
    """
    Returns a list of tags, or serializes a list of tags
    """
Run Code Online (Sandbox Code Playgroud)

我不太确定从哪里开始.如何确保博客文章序列化程序定义为

class BlogPostSerializer(serializers.Serializer):
    post = CharField()
    tags = TagsField
Run Code Online (Sandbox Code Playgroud)

会给我一个类似的json对象

{
    "post": "Here is my blog post about python",
    "tags": ["python", "django", "rest"]
}
Run Code Online (Sandbox Code Playgroud)

mic*_*mit 44

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)
)
Run Code Online (Sandbox Code Playgroud)

和(其他表示法):

class StringListField(serializers.ListField):
    child = serializers.CharField()
Run Code Online (Sandbox Code Playgroud)

这似乎更简单(也许这个类比被接受的anwser更晚添加,但无论如何都添加此选项似乎很好)

顺便说一句,它是自djang rest framework 3.0以来添加的:http://www.django-rest-framework.org/topics/3.0-announcement/


seb*_*ibe 18

处理非基于ORM的对象的数组的一种方法是覆盖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
Run Code Online (Sandbox Code Playgroud)

如果你有一个基于ORM的对象,你想看看SlugRelatedFieldmany = True属性.


从Django Rest Framework 3.0版开始,您还可以使用ListField http://www.django-rest-framework.org/api-guide/fields/#listfield