web-dev-qa-db-fra.com

Comment puis-je définir un champ de liste dans le cadre de repos Django rest?

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

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

18
sebastibe

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/

43
michel.iamit