Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json Django rest框架:禁用嵌套字段_Json_Django_Django Rest Framework - Fatal编程技术网

Json Django rest框架:禁用嵌套字段

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

我正在使用Django REST框架

我有一个名为QuestionSerializer的序列化程序,其中我指定了响应中需要的3个字段:id、json和解释。 因为我在PostgreSQL数据库中使用JSONField,所以我的json字段是存储在db中的json,我使用JSONSerializerField呈现它

这是我的密码:

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']