是否可以在django-rest-framework序列化程序中动态更改字段名称? [英] is it possible to dynamically change field name within django-rest-framework serializer?
问题描述
我有Product
和ProductCategory
模型.
假设我有ProductCategory TV
,其中
Sony
,Samsung
作为其产品.我也有MobilePhone
类别,其产品为Apple
和Nokia
.
使用DRF,我想使用序列化器获取JSON输出,如下所示:
Let's say I have ProductCategory TV
, which has
Sony
, Samsung
as its products. I also have MobilePhone
category with Apple
and Nokia
as its products.
Using DRF, I would like to get JSON output using serializers, which is similar to the below:
{
'TV':
[
'Sony':
{
'price': '$100',
'country': 'Japan',
},
'Samsung':
{
'price': '$110',
'country': 'Korea',
}
]
'mobile_phone':
[
'Apple':
{
'price': '$300',
'country': 'USA',
},
'Nokia':
{
'price': '$210',
'country': 'Finland',
}
]
}
这里的问题是序列化程序中的字段名称('TV', 'mobile_phone')
必须是动态的.
The problem here is that the field names('TV', 'mobile_phone')
in serializer have to be dynamic.
我知道我可以获取以下JSON类型
I know I can get the following JSON type
{
[
{
'product_category': 'TV',
'manufacturer: 'Sony',
'price': '$100',
'country': 'Japan',
},
{
'product_category': 'TV',
'manufacturer: 'Samgsung',
'price': '$110',
'country': 'Korea',
}
]
[
{
'product_category': 'mobile_phone',
'manufacturer: 'Samgsung',
'price': '$300',
'country': 'USA',
},
{
'product_category': 'mobile_phone',
'manufacturer: 'Apple',
'price': '$210',
'country': 'Finland',
}
]
}
使用
class CategorySerializer(serializers.Serializer):
product_category = serializer.CharField()
manufacturer = serializer.CharField()
price = serializer.CharField()
country = serializer.CharField()
但是,动态更改字段名称很难实现.有什么办法可以做到吗?
But the dynamically-changing-field-names is difficult to achieve. Is there any way I can do this?
推荐答案
您可以通过覆盖序列化程序和默认ListSerializer的to_representation
:
You can support this kind of custom format by overriding to_representation
of your Serializer and of the default ListSerializer:
-
首先,您覆盖序列化程序的
to_representation
:
First, you override
to_representation
of your serializer:
class CategorySerializer(serializers.Serializer):
# your fields here
def to_representation(self, obj):
return {
obj.manufacturer: {
'price': obj.price,
'country': obj.country
}
}
这样您的序列化类别就是这种形式:
So that your serialized categories are of this form:
{
'Sony': {
'price': '$100',
'country': 'Japan'
}
}
然后将product_category
放在列表的前面,您可以使用自定义ListSerializer 和自定义to_representation
:
Then to prepend the product_category
in front of your list, you can use a custom ListSerializer with a custom to_representation
:
class CategoryListSerializer(serializers.ListSerializer):
def to_representation(self, data):
# Group your data entries by category here
...
return {
'TV': tv_data
'mobile_phone': mobile_data
}
class CategorySerializer(serializers.Serializer):
...
class Meta:
list_serializer_class = CategoryListSerializer
这篇关于是否可以在django-rest-framework序列化程序中动态更改字段名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!