如何在 django rest 框架中定义列表字段?
Posted
技术标签:
【中文标题】如何在 django rest 框架中定义列表字段?【英文标题】:How can I define a list field in django rest framework? 【发布时间】:2013-06-21 18:15:07 【问题描述】:假设我有一堂课
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"]
【问题讨论】:
创建自定义字段的文档在这里:django-rest-framework.org/api-guide/fields.html#customfields 【参考方案1】:如果您使用的是 Postgesql,则可以使用 ArrayField
【讨论】:
【参考方案2】:为非基于 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 的对象,您希望查看带有 many = True
属性的 SlugRelatedField
。
从 Django Rest Framework 3.0 版开始,您还可以使用 ListField http://www.django-rest-framework.org/api-guide/fields/#listfield
【讨论】:
现在可以工作了吗?from_native
被赋予data[field]
,它不是列表,而是它的最后一个值。 (Django 1.6,rest-framemork 2.4.3)
WritableField 可能不适用于最新版本的 drf。试试 serializers.Field【参考方案3】:
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/
【讨论】:
以上是关于如何在 django rest 框架中定义列表字段?的主要内容,如果未能解决你的问题,请参考以下文章
Django rest framework 之 DictField、ListField、自定义字段
如何在 django rest 框架 ModelSerializer 中覆盖模型字段验证