DRF将ArrayField序列化为字符串

时间:2017-11-08 01:16:34

标签: python serialization django-rest-framework

我有一个带有ArrayField tags的模型,我需要它来回串行化为一串以逗号分隔的值。

models.py

from django.contrib.postgres.fields import ArrayField

class Snippet(models.Model):
    tags = ArrayField(models.CharField(max_length=255), default=list)

我希望将此字段作为一系列标记处理,例如tag1,tag2,tag3,我可以在模型save()方法中处理此问题,但DRF正在抱怨{tags: ["Expected a list of items but got type "str"."]}

serializers.py

class SnippetSerializer(serializers.ModelSerializer):

class Meta:
    model = Snippet
        fields = ('tags')

我可以在DRF中将此字段作为字符串进行管理?我在前端使用React,我可以在那里处理它,但我更喜欢在后端而不是客户端处理它。

1 个答案:

答案 0 :(得分:3)

您需要创建一个处理所需格式的自定义字段 postgres ArrayField的其余框架映射字段是一个ListField,因此您可以将其子类化。

from rest_framework.fields import ListField

class StringArrayField(ListField):
    """
    String representation of an array field.
    """
    def to_representation(self, obj):
        obj = super().to_representation(self, obj)
        # convert list to string
       return ",".join([str(element) for element in obj])

    def to_internal_value(self, data):
        data = data.split(",")  # convert string to list
        return super().to_internal_value(self, data)

您的序列化程序将变为:

class SnippetSerializer(serializers.ModelSerializer):
    tags = StringArrayField()

    class Meta:
        model = Snippet
        fields = ('tags')

有关在此处编写rest framekwork自定义字段的更多信息: http://www.django-rest-framework.org/api-guide/fields/#examples