Подтвердить что ты не робот

Как определить поле списка в django rest framework?

Скажем, у меня есть класс

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"]
}
4b9b3361

Ответ 1

Один способ обработки массивов для объекта, не основанного на 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

В среде 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/

Ответ 3

Если вы используете Postgesql, вы можете использовать ArrayField