json - Django:序列化器自动解析json字段并添加到公共(public)字段

标签 json django serialization

我调用序列化器:

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 use try/except in get_* method.

希望有所帮助!

关于json - Django:序列化器自动解析json字段并添加到公共(public)字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48202838/

相关文章:

javascript - 使用 PHP 在 javascript 函数中检索 json

php - django + apache2 + ssl : route URLs to PHP file?

python - 如何使文本框成为选择字段?

javascript - 以有效的 .Net 格式在 javascript 中对日期进行字符串化

匿名类的Java "method serialization"

javascript - 如何根据多变量对数据进行分类

java - 如何使用 RestEasy 框架发送多部分响应

c++ - 这个 C++ 反序列化习惯用法是什么?使用整数 ID 变量调用文件读取器函数作为 `reinterpret_cast<char *>(&id)?`

json - 在 Go 开发中过度使用 map[string]interface{}?

javascript - Chrome/Firefox 中的不同表单行为