32

Let's say I have a class

class Tags(object):

    tags = []

    def __init__(self, tags):
        self.tags = tags

and a custom list field

class TagsField(serializers.WritableField):
    """
    Returns a list of tags, or serializes a list of tags
    """

I am not too sure where to go from here. How can I make sure that a blog post serializer defined as

class BlogPostSerializer(serializers.Serializer):
    post = CharField()
    tags = TagsField

would give me a json object similar to

{
    "post": "Here is my blog post about python",
    "tags": ["python", "django", "rest"]
}
1

2 Answers 2

50

There is also the ListField in django rest framework, see http://www.django-rest-framework.org/api-guide/fields/#listfield

wtih the examples:

scores = serializers.ListField(
    child=serializers.IntegerField(min_value=0, max_value=100)
)

and (other notation):

class StringListField(serializers.ListField):
    child = serializers.CharField()

this seems simpler (maybe this class is added later than the accepted anwser, but seems good to add this option anyway)

By the way, it's added since djang rest framework 3.0: http://www.django-rest-framework.org/topics/3.0-announcement/

Sign up to request clarification or add additional context in comments.

Comments

19

One way to deal with arrays for a non ORM-based object is to override the to_native and from_native methods. In your case:

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

If you had an ORM-based object you would like to look at the SlugRelatedField with the many = True attribute.


From Django Rest Framework version 3.0 you can also use ListField http://www.django-rest-framework.org/api-guide/fields/#listfield

2 Comments

Is it working now? from_native is given data[field], which is not list, but its last value. (Django 1.6, rest-framemork 2.4.3)
WritableField may not work with latest version of drf. Try serializers.Field

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.