Как определить поле списка в 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"]
}
Ответы
Ответ 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