如何在序列化器中将字符串字段转换为列表字段

问题描述 投票:0回答:1

我有一个简单的 django 模型

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

序列化器.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()

url.py

from django.urls import path
from . import views

urlpatterns = [
    path('test\', views.Test.as_view()),
]

我得到了以下 json 输出:

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

   {
    "id":2,
    "my_field":"a"
   },

   {
    "id":3,
    "my_field":"b,c"
   }
]

现在我想将 my_filed 值从字符串转换为逗号分隔列表,预期输出:

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

   {
    "id":2,
    "my_field": ["a"]
   },

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

我尝试修改 MySerializer 如下:

序列化器.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'.

您对如何获得预期输出有什么想法吗?

任何提示表示赞赏!

django django-rest-framework django-serializer
1个回答
0
投票

您正在尝试拆分 field,而不是该字段的值。您可以基于

ListField
:

编写自定义字段包装器
from rest_framework.fields import ListField


class CommaSeparatedField(ListField):
    def get_value(self, dictionary):
        value = super().get_value(dictionary)
        return value and value.split(',')

    def to_representation(self, data):
        return ','.join(super().to_representation(data))

它可能需要一些额外的调整,但这本质上就是我们将项目包装和展开到列表中的方式;或逗号分隔的序列。

然后我们可以使用:

class MySerializer(serializers.ModelSerializer):
    my_field = CommaSeparatedField(serializers.CharField())

    class Meta:
        model = MyModel
        fields = '__all__'

但是请注意,如果值本身包含逗号,则逗号分隔值可能会出现问题。

© www.soinside.com 2019 - 2024. All rights reserved.