Serializer返回“Model对象”而不是特定字段

时间:2015-12-25 19:00:13

标签: python django django-rest-framework

我有问题。我正在使用Django REST框架创建一个API,我创建了序列化器来返回食谱和配料来烹饪。

models.py:

class Recipes(models.Model):
        title = models.CharField(max_length=50,null=True, blank=False, verbose_name=('name'))

class Tag(models.Model):
        name = models.CharField(max_length=50,null=True, blank=False, verbose_name=('name'))

class ListTag(models.Model):
        recipes = models.ForeignKey(Recipes, blank=False, on_delete=models.CASCADE, related_name='recipes')
        tag = models.ForeignKey(Tag, blank=False, on_delete=models.CASCADE, related_name='tag')

我有班级RecipesTag(成分),ListTag是包含收据ID的每种成分的列表。

serializers.py

class RecipesSerializer(serializers.ModelSerializer):
    ingredient = serializers.StringRelatedField(many=True, read_only=True, source='recipes')
    class Meta:
        model = Recipes
        fields = ('title', 'ingredient')

class TagSerializer(serializers.ModelSerializer):
    class Meta:
        model = Tag

class ListTagSerializer(serializers.ModelSerializer):
    tag = serializers.SlugRelatedField(
        read_only=True,
        slug_field='name'
     )
    class Meta:
        model = ListeTag
        fields = ('recipes','tag')

结果

RecipesSerializer

{
    "title": "Pancakes à la canadienne",
    "ingredient": [
        "ListTag object",
        "ListTag object",
        "ListTag object"
    ]
}

但我想要

{
    "title": "Pancakes à la canadienne",
    "ingredient": [
         {
             "id": 2,
             "name": "milk"
         },
         {
             "id": 3,
             "name": "rice"
         },
         {
             "id": 4,
             "name": "salade"
         },
         {
             "id": 5,
             "name": "tomato"
         }
    ]
}

{
    "title": "Pancakes à la canadienne",
    "ingredient": ["milk","rice","salade","tomato"]
}

1 个答案:

答案 0 :(得分:1)

您可以使用嵌套关系执行此操作,例如:

class RecipesSerializer(serializers.ModelSerializer):
    recipes = ListTagSerializer(many=True,read_only=True)
    class Meta:
        model = Recipes
        fields = ('title', 'recipes')

class ListTagSerializer(serializers.ModelSerializer):
    id = serializers.ReadOnlyField(source='tag.id')
    tag = serializers.SlugRelatedField(
        read_only=True,
        slug_field='name'
    )
    class Meta:
        model = ListeTag
        fields = ('id','tag')

详细了解嵌套关系here

相关问题