如何适当地将嵌套关系用于连续化器



我正在尝试在类别API端点内显示我在catperm中拥有的任何数据。我的catperm数据包括"猫","许可"one_answers"描述",它们分别是类别名称,权限和描述

每当我尝试收到时:

    cat = serializers.SlugRelatedField(slug_field='name', read_only=True)
    permission = serializers.SlugRelatedField(slug_field='name', read_only=True)

来自catpermserializer,我将拥有属性:尝试在序列化器CatPermSerializer上获取字段cat值时获得属性。序列化器字段可能被错误地命名,并且在Permission实例上不匹配任何属性或键。原始异常文本是:"许可"对象没有属性'cat'。

当前"类别" API端点外观:

{
        "name": "Travel",
        "permission": [
            {
                "description": "Camera is used to take photos"
            }
        ]
    },

这是我所需的"类别" API端点外观:

{
        "name": "Travel",
        "permission": [
            {
                "cat": "Travel",
                "permission": "Internet",
                "description": "This is a description inside CatPerm"
            }
        ]
    },

models.py

class CatPerm(models.Model):
    cat = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='permissions')
    permission = models.ForeignKey(Permission, on_delete=models.CASCADE)
    description = models.TextField()

class Category(models.Model):
    name = models.CharField(max_length=50)
    permission = models.ManyToManyField(Permission,
                                        related_name='category_permissions',
                                        through='CatPerm'
                                        )

class Permission(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    platform = models.CharField(
        max_length=10,
        choices=PLATFORM_CHOICES,
        default=BOTH,
    )
    classification = models.CharField(
        max_length=10,
        choices=CLASSIFICATION_CHOICES,
        default=LOW,
    )

serializer.py

class CatPermSerializer(serializers.ModelSerializer):
    cat = serializers.SlugRelatedField(slug_field='name', read_only=True)
    permission = serializers.SlugRelatedField(slug_field='name', read_only=True)
    class Meta:
        model = CatPerm
        fields = ("cat", "permission", "description")

class CategorySerializer(serializers.ModelSerializer):
    permission = CatPermSerializer(many=True, read_only=True)
    class Meta:
        model = Category
        fields = ("name", "permission")

如果要自定义响应,则可以覆盖to_representation()

class CategorySerializer(serializers.ModelSerializer):
   class Meta:
       model = Category
       fields = ('name',)
    def to_representation(self, instance):
        data = super().to_representation(instance)
        # Here you can do whatever you need, for instance add different fields to response
        data['permissions'] = []
        for perm in instance.permissions.all():
            data['permissions'].append({'name': perm.name})
        return data

最新更新