如何使用 django-rest-framework 中的序列化器将相似数据合并到自定义字段中?

Posted

技术标签:

【中文标题】如何使用 django-rest-framework 中的序列化器将相似数据合并到自定义字段中?【英文标题】:How to merge similar data into a custom field using serializers in django-rest-framework? 【发布时间】:2020-02-28 21:24:24 【问题描述】:

我有一个 api,它返回 material_id、material_name 以及它的 store_id(外键)和 store_name,它还有一个搜索后端。所以我想返回一个密钥材料上的所有 material_name 和 material_id 以及密钥存储中的所有存储字段。

所以我尝试了下面的代码

class MaterialSuggestions(generics.ListAPIView):
    search_fields = ['name', 'shape', 'color', 'material_type', 
                     'surface_type', 'store__name']
    filter_backends = (filters.SearchFilter,)
    queryset = Material.objects.all()
    serializer_class = MaterialSuggestionsSerializer 



class MaterialSuggestionsSerializer(serializers.ModelSerializer):
    class Meta:
        model = Material
        fields = ('material','store')


    material =  serializers.SerializerMethodField('get_material')
    store = serializers.SerializerMethodField('get_store')


    def get_material(self,obj):
        return 'material_id':obj.id,'material_name':obj.name


    def get_store(self,obj):
        return 'store_id':obj.store.id,'store_name':obj.store.name

当我调用 api 时,我得到如下信息:

    
        "material": 
            "material_id": 14,
            "material_name": "test"
        ,
        "store": 
            "store_id": 28,
            "store_name": "test1"
        
    ,
    
        "material": 
            "material_id": 13,
            "material_name": "test3"
        ,
        "store": 
            "store_id": 29,
            "store_name": "test2"
        
    
] 

这是我理想的回报。

    
        "material": [ 
                       "material_id": 14,
                       "material_name": "test"
                      ,
                     
                      "material_id": 13,
                      "material_name": "test3"
                              
                   ]


          "store": [  
                       "store_id": 28,
                       "store_name": "test1"
                      ,
                      
                       "store_id": 29,
                       "store_name": "test2"
                      
                  ]
     

或者即使这样也很棒

    
        "material":  
                       "material_id": 14,13
                       "material_name": "test","test3"
                      ,       



          "store":   
                       "store_id": 28,29
                       "store_name": "test1","test2"
                      ,


     

我们如何操作使用序列化器返回的数据,以及如何访问进入序列化器的查询集?

【问题讨论】:

【参考方案1】:

您想要的输出不再是真正的模型序列化程序,例如您完全松散了材料和商店之间的关系。

您应该考虑构建自己的字典,然后将其转换为自定义 json 并将其作为响应传递,如下所述: https://***.com/a/35019122/12197595

【讨论】:

以上是关于如何使用 django-rest-framework 中的序列化器将相似数据合并到自定义字段中?的主要内容,如果未能解决你的问题,请参考以下文章

文本标注系统

为啥 django-rest-framework 不显示 OneToOneField 数据 - django

尽管有 AllowAny 权限,django-rest-framework 在 POST、PUT、DELETE 上返回 403 响应

[精选] Mysql分表与分库如何拆分,如何设计,如何使用

如果加入条件,我该如何解决。如果使用字符串连接,我如何使用

如何使用本机反应创建登录以及如何验证会话