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)
whenqs
-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"
},