Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DRF将ArrayField序列化为字符串_Python_Serialization_Django Rest Framework - Fatal编程技术网

Python DRF将ArrayField序列化为字符串

Python DRF将ArrayField序列化为字符串,python,serialization,django-rest-framework,Python,Serialization,Django Rest Framework,我有一个带有ArrayField标记的模型,我需要它来回序列化为一个由逗号分隔的值字符串 型号.py from django.contrib.postgres.fields import ArrayField class Snippet(models.Model): tags = ArrayField(models.CharField(max_length=255), default=list) class SnippetSerializer(serializers.ModelSer

我有一个带有ArrayField
标记的模型,我需要它来回序列化为一个由逗号分隔的值字符串

型号.py

from django.contrib.postgres.fields import ArrayField

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

class Meta:
    model = Snippet
        fields = ('tags')
我希望将此字段作为一个标签字符串处理,如
tag1、tag2、tag3
,我可以在model
save()
方法中处理此字段,但DRF抱怨
{tags:[“需要一个项目列表,但得到类型“str”。]}

序列化程序.py

from django.contrib.postgres.fields import ArrayField

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

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

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

您需要创建一个自定义字段来处理所需的格式 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自定义字段的详细信息:

这可以正常工作,但drf web UI仍然显示消息-“列表当前不支持HTML输入。”。有没有办法让这个字段可以编辑,我们在这里输入逗号分隔的值。你应该能够发布json,在drf web UI中,除了HTML表单之外,它的左边还有一个“原始数据”,你可以发布json数据并输入逗号分隔的值。