我调用序列化器:
serializer = MySerializer(qs, many=True)
当 qs
- myModel 的查询集
from rest_framework.serializers import Serializer
class MySerializer(Serializer):
param1 = CharField()
param2 = IntegerField(required=False)
custom_fields = JSONField()
class Meta:
pass
接下来,我只使用 custom_fields
并手动获取值。
是否可以在此阶段获取此 custom_fields
中的字段并通过序列化程序返回它们?
custom_fields
包含:
{
'custom_value1': 3,
'custom_value2': 5
}
已更新
:我想在序列化器之后得到什么:
{
'param1': 'value1',
'param2': 'value2',
'custom_value1': 3,
'custom_value2': 5
}
最佳答案
恐怕我完全理解你的问题......你问你可以获取自定义字段的数据吗?
那么答案是是
如果您只是使用 MySerializer
向 APIView 调用 GET 请求,您可以从您的模型中获取所有数据。
如果您想从您的模型中获取数据,您只需使用 ModelSerializer
。 (http://www.django-rest-framework.org/api-guide/serializers/#modelserializer)。 ModelSerializer
更简单,但您也可以使用自己的序列化程序。
现在我遇到了类似的情况,我可以得到我所有的额外数据(和你一样,它是json对象)
我附上我的序列化程序并做出响应。我希望它能帮助你。
我的 serialzier(extra
字段是 JsonField
)
class JobUserSerializer(serializers.ModelSerializer):
class Meta:
model = JobUser
fields = (
"email",
"is_active",
"is_staff",
"id",
"extra",
)
read_only_fields = (
"id",
)
我的回复(GET 请求到 View 集。您可以看到额外的 json 数据)
{
"email": "test5@test.com",
"is_active": true,
"is_staff": false,
"id": 13,
"extra": {
"last_name": "kim",
"first_name": "seul",
"gcf_spouses_name": "test",
"gcf_spouses_position": "test"
}
},
更新
我认为你可以使用 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"
},
Be careful using this method: your json field SHOULD have that key. If one of your serializing model don't have the key, it raises
NoneType TypeError
. Or you can usetry/except
inget_*
method.
希望有所帮助!
关于json - Django:序列化器自动解析json字段并添加到公共(public)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48202838/