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