Django Rest框架动态分组对象

2024-04-29 12:52:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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

models.py

class Product(models.Model):
    name = models.CharField(max_length=20)

class Ingredient(models.Model):
    name = models.CharField(max_length=20)

class Mix(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    ingredient = models.ForeignKey(Ingredient, on_delete=models.CASCADE)
    percentage = models.FloatField()

    class Meta:
        unique_together = ('product', 'ingredient')

serializer.py

class MixSerializer(serializer.ModelSerializer):
    class Meta:
        model = Mix
        fields = ('product', 'liquid', 'percentage')

views.py

class MixView(viewsets.ModelViewSet):
    queryset = Mix.objects.all()
    serializer_class = MixSerializer

这是我目前从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
    }
}

通过遵循Nested Relationship的文档,但我不再相信这是正确的做法。我很乐意从对象过滤器获取这些数据,但无法与序列化器/视图一起实现


Tags: 对象namepymodelmodelsproductclasscharfield
1条回答
网友
1楼 · 发布于 2024-04-29 12:52:15

首先注意,根据您的示例,您是按产品分组的,因此您不是在寻找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下实现createupdate方法

相关问题 更多 >