【问题标题】:How can I define a list field in django rest framework?如何在 django rest 框架中定义列表字段?
【发布时间】: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 json list field django-rest-framework


【解决方案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/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      相关资源
      最近更新 更多