如何在 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_nativefrom_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 框架中更改字段名称

如何在 django rest 框架 ModelSerializer 中覆盖模型字段验证

在Django rest框架中获取图像文件和字段

如何在 django rest 框架中为枚举字段创建序列化程序

django rest框架返回视图中的选定字段