我有一个带有ArrayField 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,我可以在那里处理它,但我更喜欢在后端而不是客户端处理它。
答案 0 :(得分:3)
您需要创建一个处理所需格式的自定义字段 postgres ArrayField的其余框架映射字段是一个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 framekwork自定义字段的更多信息: http://www.django-rest-framework.org/api-guide/fields/#examples