Django Rest Objects отображаются дважды или более

В настоящее время у меня есть модель с именем Board, и Board можно раскрасить и заштриховать:

class Board(models.Model):
    name = models.CharField(max_length=200)
    colored = models.BooleanField(default=False)
    shaped = models.BooleanField(default=False)

Я хотел бы создать API, который возвращает все цветные и все шаппированные разделенные в одном запросе следующим образом:

[{
        "all_colored": [
            {
                "id": 1,
                "name": "test 1",
                "colored": true,
                "shaped": false
            }
        ],
        "all_shaped": [
            {
                "id": 2,
                "name": "test 2",
                "colored": false,
                "shaped": true
            }
        ]
    }]

Да, мне нужен именно такой вывод, как указано выше, независимо от того, как я могу этого добиться. Но в настоящее время я получаю это дважды или больше, если я создаю 2 доски, я получу дважды, если я создаю 3 доски, я получу три раза, текущий вывод при создании 2 досок:

[
    {
        "all_colored": [
            {
                "id": 1,
                "name": "test 1",
                "colored": true,
                "shaped": false
            }
        ],
        "all_shaped": [
            {
                "id": 2,
                "name": "test 2",
                "colored": false,
                "shaped": true
            }
        ]
    },
    {
        "all_colored": [
            {
                "id": 1,
                "name": "test 1",
                "colored": true,
                "shaped": false
            }
        ],
        "all_shaped": [
            {
                "id": 2,
                "name": "test 2",
                "colored": false,
                "shaped": true
            }
        ]
    }
]

Мой набор представлений:

class BoardViewSet(ModelViewSet):
    serializer_class = BoardSerializer
    queryset = Board.objects.all()

    def get_serializer_class(self):
        if self.action == "list":
            return ListFilterSerializer

        return self.serializer_class

мои сериализаторы:

class BoardSerializer(serializers.ModelSerializer):
    class Meta:
        model = Board
        fields = "__all__"


class ListFilterSerializer(serializers.ModelSerializer):
    all_colored = serializers.SerializerMethodField()
    all_shaped = serializers.SerializerMethodField()

    def get_all_colored(self, obj):
        qs = Board.objects.filter(colored=True)
        data = BoardSerializer(qs, many=True).data
        return data

    def get_all_shaped(self, obj):
        qs = Board.objects.filter(shaped=True)
        data = BoardSerializer(qs, many=True).data
        return data

    class Meta:
        model = Board
        fields = ["all_colored", "all_shaped"]

Я не нашел ни одного документа, который помог бы мне, если у вас есть ссылка о том, как это реализовать, пожалуйста, дайте мне.

По умолчанию ModelViewSet.list применяет сериализатор ко всем объектам в кверисете. В вашем случае он вызывает get_all_colored и get_all_shaped для каждого объекта Board. Чтобы изменить это поведение, вы можете переопределить метод list в классе BoardViewSet:

def list(self, request, *args, **kwargs):
    serializer = ListFilterSerializer()
    return Response(serializer.data)

Вы можете найти реализацию по умолчанию в классе ListModelMixin

Вернуться на верх