Django: Serializer automatically parse json field and add to common fields

时间:2018-01-11 08:42:39

标签: json django serialization

I call serializer:

serializer = MySerializer(qs, many=True) when qs - QuerySets for myModel

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

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

   class Meta:
        pass

Next, I just use the custom_fields and get the values manually. Is it possible at this stage to get the fields inside this custom_fields and return them through the serializer?

custom_fields contains:

{
 'custom_value1': 3, 
 'custom_value2': 5
}

updated: What i want to get after serializer:

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

1 个答案:

答案 0 :(得分:0)

我担心我完全理解你的问题...你问你可以获得自定义字段的数据吗?

然后回答

如果您只是使用MySerializer向APIView调用GET请求,则可以从模型中获取所有数据。

如果您想从模型中获取数据,只需使用ModelSerializer即可。 (http://www.django-rest-framework.org/api-guide/serializers/#modelserializer)。 ModelSerializer更容易,但您也可以使用自己的序列化程序。

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

我附上了我的序列化程序并重新开始。我希望它对你有所帮助。

我的序列号extra字段为JsonField

class JobUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = JobUser
        fields = (
            "email",
            "is_active",
            "is_staff",
            "id",
            "extra",
        )
        read_only_fields = (
            "id",
        )

我的回复(对视图集的GET请求。您可以看到额外的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"
},
  

小心使用此方法:你的json字段应该有那个键。如果您的某个序列化模型没有密钥,则会引发NoneType TypeError。或者您可以在try/except方法中使用get_*

希望有所帮助!