假设我有一个班级
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"]
}
答案 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_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的对象,则希望查看SlugRelatedField
属性many = True
。
从Django Rest Framework 3.0版开始,您也可以使用ListField http://www.django-rest-framework.org/api-guide/fields/#listfield
答案 2 :(得分:-2)
如果您使用的是Postgesql,则可以使用ArrayField