簡體   English   中英

django rest 框架 - 將相關對象字段序列化為平面 json dict

[英]django rest framework - serializing related object fields to a flat json dict

DRF 文檔描述了一種創建嵌套序列化程序的方法,該序列化程序可以生成如下所示的字典:

{
    "field1": "val1",
    "field2": "val2",
    "related_obj": {
        "related_obj_field_1": "val1",
        "related_obj_field_2": "val2",
    }
}

但是,如果我想創建一個包含與父對象字段處於同一級別的所有相關對象字段的平面字典,該怎么辦? 像這樣:

{
    "field1": "val1",
    "field2": "val2",
    "related_obj_field_1": "val1",
    "related_obj_field_2": "val2",

}

目前我正在使用SerializerMethodField實現這一點:

class SomeSerializer(serializers.ModelSerializer):

    related_obj_field = serializers.SerializerMethodField()

    @staticmethod
    def get_related_obj_field(obj):
        return obj.related_obj.field

但我希望有一種更清潔的方法來做到這一點。

好吧,我不認為有一些內置的 Python 功能可以使字典變平,但是您可以使用遞歸的概念編寫一個。 想法是遍歷所有鍵值對並查看值是否是字典,然后調用遞歸方法,否則只需使用鍵值更新扁平字典

def flatten_dict(dictionary, flatten_dictionary):
    for k, v in dictionary.iteritems():
        if not isinstance(v, dict):
            flatten_dictionary[k] = v
        else:
            flatten_dict(v, flatten_dictionary)

f_dict = {}
flatten_dict(d, f_dict)
print f_dict
>>> {'field2': 'val2', 'related_obj_field_1': 'val1', 'related_obj_field_2': 'val2', 'field1': 'val1'}

實現它的清晰方法是使用 Serializer 的to_representation()方法。 它有助於在轉換為 json 之前修改序列化程序的數據:

class OrganizationUsersSerializer(serializers.ModelSerializer):
    user = UserSerializer()

    class Meta:
        model = UserOrganizations
        fields = ['organization_name', 'user']

    def to_representation(self, instance):
        data = super(OrganizationUsersSerializer, self).to_representation(instance)
        profile = data.pop('user')
        for key, val in profile.items():
            data.update({key: val})
        return data

因此,您刪除嵌套對象並將其字段(在其自己的序列化程序中指定)添加到同一級別。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM