Python Django Rest框架动态分组对象
我的问题与Django RestFramework以及如何动态分组对象有关。我发现最相似的答案来自雷克斯·索尔兹伯里,但不适用于n组: models.py 序列化程序.py views.py 这是我目前从API获得的结构示例:Python Django Rest框架动态分组对象,python,python-3.x,django,django-rest-framework,Python,Python 3.x,Django,Django Rest Framework,我的问题与Django RestFramework以及如何动态分组对象有关。我发现最相似的答案来自雷克斯·索尔兹伯里,但不适用于n组: models.py 序列化程序.py views.py 这是我目前从API获得的结构示例: [ { "product": "White Russian", "ingredient": "Vodka", "percen
[
{
"product": "White Russian",
"ingredient": "Vodka",
"percentage": 0.54
},
{
"product": "White Russian",
"ingredient": "Coffee Liquer",
"percentage": 0.27
},
{
"product": "White Russian",
"ingredient": "Single Cream",
"percentage": 0.19
}
]
我一直在尝试以一种尽量减少产品名称重复的方式对其进行分组,类似这样的方式
{
"product": "White Russian",
"ingredients": {
"Vodka": 0.54,
"Coffee Liquer": 0.27,
"Single Cream": 0.19
}
}
通过遵循的文档,但我不再相信这是正确的做法。我很乐意从对象过滤器获取这些数据,但无法与序列化器/视图一起实现。首先注意,根据您的示例,您是按产品分组的,因此您不是在寻找
MixView
,而是在寻找ProductView
你能做的是:
# Serializers
class MixSerializer(serializer.ModelSerializer):
ingredient_name = serializers.CharField(source='ingredient.name')
class Meta:
model = Mix
fields = ('ingredient_name', 'percentage')
class ProductSerializer(serializer.ModelSerializer):
ingridients = MixSerializer(many=True, read_only=True)
class Meta:
model = Product
fields = ('name', 'ingridients')
# Views
class ProductView(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
应该给你一些类似的东西:
{
"name": "White Russian",
"ingredients": [
{"ingredient_name": "Vodka", "percentage" : 0.54},
{"ingredient_name": "Coffee Liquer", "percentage" : 0.27},
{"ingredient_name": "Single Cream", "percentage" : 0.19}
]
}
另外,要使其成为非只读,您还需要在ProductSerializer下实现
创建
和更新
方法,这已经帮了大忙。但是,我确实必须在成分变量中添加一个额外的参数source='mix_set'
,以使其基本正常工作。我现在面临的是字段名'component\u name'对模型'Mix'无效。
这是意外的,因此我正在对代码进行三重检查。对,必须在Mix下声明成分名称,我编辑了代码1附加行成分名称=序列化程序.CharField(source='component.name')
{
"product": "White Russian",
"ingredients": {
"Vodka": 0.54,
"Coffee Liquer": 0.27,
"Single Cream": 0.19
}
}
# Serializers
class MixSerializer(serializer.ModelSerializer):
ingredient_name = serializers.CharField(source='ingredient.name')
class Meta:
model = Mix
fields = ('ingredient_name', 'percentage')
class ProductSerializer(serializer.ModelSerializer):
ingridients = MixSerializer(many=True, read_only=True)
class Meta:
model = Product
fields = ('name', 'ingridients')
# Views
class ProductView(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
{
"name": "White Russian",
"ingredients": [
{"ingredient_name": "Vodka", "percentage" : 0.54},
{"ingredient_name": "Coffee Liquer", "percentage" : 0.27},
{"ingredient_name": "Single Cream", "percentage" : 0.19}
]
}