我有一个简单的 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'.
您对如何获得预期输出有什么想法吗?
任何提示表示赞赏!
您正在尝试拆分 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__'
但是请注意,如果值本身包含逗号,则逗号分隔值可能会出现问题。