如何使用 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 响应