Json Django rest框架:禁用嵌套字段
我正在使用Django REST框架 我有一个名为QuestionSerializer的序列化程序,其中我指定了响应中需要的3个字段:id、json和解释。 因为我在PostgreSQL数据库中使用JSONField,所以我的json字段是存储在db中的json,我使用JSONSerializerField呈现它 这是我的密码:Json Django rest框架:禁用嵌套字段,json,django,django-rest-framework,Json,Django,Django Rest Framework,我正在使用Django REST框架 我有一个名为QuestionSerializer的序列化程序,其中我指定了响应中需要的3个字段:id、json和解释。 因为我在PostgreSQL数据库中使用JSONField,所以我的json字段是存储在db中的json,我使用JSONSerializerField呈现它 这是我的密码: class JSONSerializerField(serializers.Field): """ Serializer for JSONField -- re
class JSONSerializerField(serializers.Field):
""" Serializer for JSONField -- required to make field writable"""
def to_internal_value(self, data):
return data
def to_representation(self, value):
return value
class QuestionSerializer(serializers.ModelSerializer):
content = JSONSerializerField(source='json')
class Meta:
model = Question
fields = ('id', 'content', 'explanation')
所以,每次我使用QuestionSerializer时,我的回答都是这样的:
{
"id": 1,
"content": {
"question": "question",
"answers": [
{"answer": "answer"},
{"answer": "answer"},
{"answer": "answer"},
{"answer": "answer"},
{"answer": "answer"}
],
}
"explanation": "explanation"
}
但我需要删除“内容”字段以获得如下响应:
{
"id": 1,
"question": "question",
"answers": [
{"answer": "answer"},
{"answer": "answer"},
{"answer": "answer"},
{"answer": "answer"},
{"answer": "answer"}
],
"explanation": "explanation"
}
我该怎么办
谢谢 您应该更新字段,使其直接返回/读取内容:
class JSONSerializerField(serializers.Field):
""" Serializer for JSONField -- required to make field writable"""
def to_internal_value(self, data):
return {'content': data}
def to_representation(self, value):
return value['content']
您可以将内容设置为只写字段,并将其用于存储数据。添加两个新的只读字段,并使用它们获取如下数据:
class QuestionSerializer(serializers.ModelSerializer):
content = JSONSerializerField(source='json', write_only=True)
question = serializers.SerializerMethodField()
answers = serializers.SerializerMethodField()
class Meta:
model = Question
fields = ('id', 'content','question', 'answers', 'explanation')
def get_questions(self, obj):
return obj.content['question']
def get_answers(self, obj):
return obj.content['answers']
我找到了正确的解决办法。我删除了“content”字段和JSONSerializerField类,并开始使用
谢谢你,阿努什!我刚刚发布了正确的解决方案,但多亏了你的回答,我找到了它。
class QuestionSerializer(serializers.ModelSerializer):
question = serializers.SerializerMethodField()
answers = serializers.SerializerMethodField()
class Meta:
model = Question
fields = ('id', 'question', 'answers', 'explanation')
def get_question(self, obj):
return obj.json['question']
def get_answers(self, obj):
return obj.json['answers']