Disons que j'ai une classe
class Tags(object):
tags = []
def __init__(self, tags):
self.tags = tags
et un champ de liste personnalisé
class TagsField(serializers.WritableField):
"""
Returns a list of tags, or serializes a list of tags
"""
Je ne sais pas trop où aller d'ici. Comment puis-je m'assurer qu'un sérialiseur d'articles de blog défini comme
class BlogPostSerializer(serializers.Serializer):
post = CharField()
tags = TagsField
me donnerait un objet json similaire à
{
"post": "Here is my blog post about python",
"tags": ["python", "Django", "rest"]
}
Une façon de gérer les tableaux pour un objet non basé sur ORM est de remplacer le to_native
et from_native
méthodes. Dans ton cas:
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
Si vous aviez un objet basé sur ORM, vous aimeriez regarder le SlugRelatedField
avec le many = True
attribut.
Depuis Django Rest Framework version 3.0, vous pouvez également utiliser ListField http://www.Django-rest-framework.org/api-guide/fields/#listfield
Il y a aussi le ListField dans Django repos framework, voir http://www.Django-rest-framework.org/api-guide/fields/#listfield
avec les exemples:
scores = serializers.ListField(
child=serializers.IntegerField(min_value=0, max_value=100)
)
et (autre notation):
class StringListField(serializers.ListField):
child = serializers.CharField()
cela semble plus simple (peut-être que cette classe est ajoutée plus tard que la réponse acceptée, mais semble quand même bien ajouter cette option)
Soit dit en passant, il est ajouté depuis djang rest framework 3.0: http://www.Django-rest-framework.org/topics/3.0-announcement/