Python Django Rest框架动态分组对象

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

我的问题与Django RestFramework以及如何动态分组对象有关。我发现最相似的答案来自雷克斯·索尔兹伯里,但不适用于n组:

models.py

序列化程序.py

views.py

这是我目前从API获得的结构示例:

[ 
    {
        "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}
    ]
}