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

会给我一个类似于

{
    "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 对象处理数组to_native的一种方法是重写andfrom_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

于 2013-07-29T02:02:23.187 回答
-3

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

于 2015-07-02T16:54:40.960 回答