DRF 将 ArrayField 序列化为字符串

Pep*_*zza 3 python serialization django-rest-framework

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

模型.py

from django.contrib.postgres.fields import ArrayField

class Snippet(models.Model):
    tags = ArrayField(models.CharField(max_length=255), default=list)
Run Code Online (Sandbox Code Playgroud)

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

序列化程序.py

class SnippetSerializer(serializers.ModelSerializer):

class Meta:
    model = Snippet
        fields = ('tags')
Run Code Online (Sandbox Code Playgroud)

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

Gab*_*Muj 7

您需要创建一个自定义字段来处理您想要的格式 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)
Run Code Online (Sandbox Code Playgroud)

您的序列化程序将变为:

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

    class Meta:
        model = Snippet
        fields = ('tags')
Run Code Online (Sandbox Code Playgroud)

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