Pep*_*zza 3 python serialization django-rest-framework
我有一个带有 ArrayField 的模型,tags我需要它作为以逗号分隔的值字符串来回序列化。
模型.py
from django.contrib.postgres.fields import ArrayField
class Snippet(models.Model):
tags = ArrayField(models.CharField(max_length=255), default=list)
Run Code Online (Sandbox Code Playgroud)
我希望将此字段作为一串标签处理,例如tag1,tag2,tag3,我可以在模型save()方法中处理此问题,但 DRF 抱怨{tags: ["Expected a list of items but got type "str"."]}.
序列化程序.py
class SnippetSerializer(serializers.ModelSerializer):
class Meta:
model = Snippet
fields = ('tags')
Run Code Online (Sandbox Code Playgroud)
我可以在 DRF 中做什么来将此字段作为字符串管理?我在前端使用 React,我可以在那里处理它,但我更喜欢在后端而不是客户端处理它。
您需要创建一个自定义字段来处理您想要的格式 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)
Run Code Online (Sandbox Code Playgroud)
您的序列化程序将变为:
class SnippetSerializer(serializers.ModelSerializer):
tags = StringArrayField()
class Meta:
model = Snippet
fields = ('tags')
Run Code Online (Sandbox Code Playgroud)
有关在此处编写其余框架自定义字段的更多信息:http : //www.django-rest-framework.org/api-guide/fields/#examples
| 归档时间: |
|
| 查看次数: |
5914 次 |
| 最近记录: |