You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django Serializer中将字符串字段转换为列表字段

问题描述

我有一个简单的Django模型及DRF序列化配置,现在需要将my_field的逗号分隔字符串转为列表输出,但修改序列化器时出错,求解决方法。

现有代码

models.py

from django.db import models

class MyModel(models.Model):
    my_field = models.CharField(max_length=20)

    def __str__(self):
        return self.my_field

serializers.py(初始版本)

from rest_framework import serializers
from .models import MyModel

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'

views.py

from rest_framework import generics
from .serializers import MySerializer
from .models import MyModel

class TestView(generics.ListAPIView):
    serializer_class = MySerializer
    queryset = MyModel.objects.all()

urls.py(修正语法错误后的版本)

from django.urls import path
from . import views

urlpatterns = [
    path('test/', views.TestView.as_view()),
]

当前输出

[
   {
    "id":1,
    "my_field":"a,b,c"
   },
   {
    "id":2,
    "my_field":"a"
   },
   {
    "id":3,
    "my_field":"b,c"
   }
]

期望输出

[
   {
    "id":1,
    "my_field":["a", "b", "c"]
   },
   {
    "id":2,
    "my_field": ["a"]
   },
   {
    "id":3,
    "my_field":["b", "c"]
   }
]

尝试过的错误写法

修改后的serializers.py:

from rest_framework import serializers
from .models import MyModel

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'

    def __init__(self, *args, **kwargs):
        super(MySerializer, self).__init__(*args, **kwargs)
        return self.fields['my_field'].split(',')

出现错误:AttributeError: CharField object has no attribute 'split'


解决方案

方法1:使用SerializerMethodField

这是处理自定义字段输出逻辑最直观的方式:

from rest_framework import serializers
from .models import MyModel

class MySerializer(serializers.ModelSerializer):
    my_field = serializers.SerializerMethodField()

    class Meta:
        model = MyModel
        fields = '__all__'

    def get_my_field(self, obj):
        # 处理空字符串场景,避免返回['']
        if not obj.my_field:
            return []
        # 分割后去除每个元素的首尾空格(适配带空格的逗号分隔场景)
        return [item.strip() for item in obj.my_field.split(',')]

方法2:重写序列化器的to_representation方法

如果需要同时处理多个字段,或不想单独定义字段,可重写该方法统一处理输出:

from rest_framework import serializers
from .models import MyModel

class MySerializer(serializers.ModelSerializer):
    class Meta:
        model = MyModel
        fields = '__all__'

    def to_representation(self, instance):
        data = super().to_representation(instance)
        # 转换my_field为列表
        if data.get('my_field'):
            data['my_field'] = [item.strip() for item in data['my_field'].split(',')]
        else:
            data['my_field'] = []
        return data

方法3:自定义字段类型

如果多个序列化器都需要这种逗号转列表的逻辑,可以封装成自定义字段复用:

from rest_framework import serializers

class CommaSeparatedListField(serializers.CharField):
    def to_representation(self, value):
        if not value:
            return []
        return [item.strip() for item in value.split(',')]

# 在序列化器中使用自定义字段
from .models import MyModel

class MySerializer(serializers.ModelSerializer):
    my_field = CommaSeparatedListField()

    class Meta:
        model = MyModel
        fields = '__all__'

内容的提问来源于stack exchange,提问作者szaki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 12:58:37