DRF将ArrayField序列化为字符串

4

我有一个包含数组字段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个回答

9
您需要创建一个自定义字段来处理您想要的格式。Postgres ArrayField 的 REST 框架映射字段是 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 framework自定义字段的信息: http://www.django-rest-framework.org/api-guide/fields/#examples


这个可以正常工作,但是drf web UI仍然显示消息 - "Lists are not currently supported in HTML input."。有没有办法使这个字段可编辑,我们输入逗号分隔的值。 - Kumar Deepak
1
除了 HTML 表单之外,在 DRF Web UI 中,您应该能够发布 JSON。在其左侧有一个“原始数据”选项,您可以在那里发布 JSON 数据并输入逗号分隔的值。 - Gabriel Muj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接