Как правильно использовать вложенные отношения для сериализаторов? - PullRequest
0 голосов
/ 01 июля 2019

Я пытаюсь отобразить все данные, которые у меня есть в моем CatPerm, в моей конечной точке API категории.Мои данные CatPerm состоят из «кошка», «разрешение» и «описание», где они представляют собой имя категории, разрешение и описание соответственно

Всякий раз, когда я пытаюсь забрать:

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

отCatPermSerializer, у меня будет AttributeError: Got AttributeError при попытке получить значение для поля cat в сериализаторе CatPermSerializer.Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре 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")

1 Ответ

0 голосов
/ 01 июля 2019

Если вы хотите настроить свой ответ, вы можете переопределить 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...