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

时间:2013-06-25 04:11:32

标签: django json list field django-rest-framework

假设我有一个班级

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

3 个答案:

答案 0 :(得分:41)

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/

答案 1 :(得分:16)

处理非基于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

如果您有基于ORM的对象,则希望查看SlugRelatedField属性many = True


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

答案 2 :(得分:-2)

如果您使用的是Postgesql,则可以使用ArrayField