Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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
Django:序列化程序自动解析json字段并添加到公共字段_Json_Django_Serialization - Fatal编程技术网

Django:序列化程序自动解析json字段并添加到公共字段

Django:序列化程序自动解析json字段并添加到公共字段,json,django,serialization,Json,Django,Serialization,我调用序列化程序: { 'param1': 'value1', 'param2': 'value2', 'custom_value1': 3, 'custom_value2': 5 } serializer=MySerializer(qs,many=True)whenqs-querysetsformymodel from rest_framework.serializers import Serializer class MySerializer(Serializer): p

我调用序列化程序:

{
 'param1': 'value1',
 'param2': 'value2',
 'custom_value1': 3, 
 'custom_value2': 5
}
serializer=MySerializer(qs,many=True)
when
qs
-querysetsformymodel

from rest_framework.serializers import Serializer
class MySerializer(Serializer):

   param1 = CharField()
   param2 = IntegerField(required=False)
   custom_fields = JSONField()

   class Meta:
        pass
接下来,我只需使用
自定义_字段
并手动获取值。 在此阶段,是否可以获取此
自定义\u字段中的字段并通过序列化程序返回它们

自定义字段
包含:

{
 'custom_value1': 3, 
 'custom_value2': 5
}
已更新
:序列化程序之后我想要获得的内容:

{
 'param1': 'value1',
 'param2': 'value2',
 'custom_value1': 3, 
 'custom_value2': 5
}

恐怕我完全理解你的问题。。。您要求您可以获取自定义字段的数据

那么答案是肯定的

如果您只需使用MySerializer
调用GET request到APIView,就可以从模型中获取所有数据

如果希望从模型中获取数据,只需使用
ModelSerializer
。().
ModelSerializer
简单得多,但您也可以使用自己的序列化程序

现在我经历了类似的情况,我可以得到所有额外的数据(和你一样,它是json对象)

我附加我的序列化程序和响应。我希望它能帮助你

My serialzier
extra
字段为
JsonField

我的响应(获取对视图集的请求。您可以看到额外的json数据)

更新 我认为您可以使用
get.*
方法并使用它

这是我的示例代码

class JobUserSerializer(serializers.ModelSerializer):
    first_name_from_extra = serializers.SerializerMethodField()

    class Meta:
        model = JobUser
        fields = (
            "email",
            "is_active",
            "is_staff",
            "id",
            # "extra",
            "first_name_from_extra"
        )
        read_only_fields = (
            "id",
        )

    def get_first_name_from_extra(self, obj):
        try:
            return obj.extra['first_name']
        except TypeError:
            return ""
然后您可以直接访问“first_name”(我的额外json字段的键)

我的回答

{
    "email": "test5@test.com",
    "is_active": true,
    "is_staff": false,
    "id": 13,
    "first_name_from_extra": "seul"
},
使用此方法时要小心:json字段应该具有该键。如果其中一个序列化模型没有密钥,则会引发
NoneType-TypeError
。或者您可以在
get.*
方法中使用
try/except


希望有帮助

抱歉,我已将更改添加到问题中。现在我和你一样。但是我想在没有父母的情况下拥有这些田地哦,我想我错了。我会按照这个方向更新我的答案。另一个小问题-如果我们不知道哪些字段是多余的,那么我们似乎无法解析它,没有办法像我所希望的那样返回?嗯,也许它可以。。我想我必须在序列化程序中尝试一些。我想通过迭代所有“额外”键并将其提供给序列化程序是可能的。尝试之后,我会更新我的答案。
{
    "email": "test5@test.com",
    "is_active": true,
    "is_staff": false,
    "id": 13,
    "first_name_from_extra": "seul"
},