Модифицированные выходные данные в методе to_representation в django drf
могу ли я вернуть список в методе to_representation в Django Rest Framework
Мне нужно изменить вывод в сериализаторе вот недавний вывод
{
"id": 1,
"display_sequence": 2
}
Мне нужно изменить недавний вывод на
[
{
"id": 1
"display_sequence": 2
},
{
"id" : 2
"display_sequence": 1
}
]
Итак, вторые данные я получил из фильтра запроса, основанного на id контейнера и target_container_id
instance = Container.objects.filter(id__in=[self.container_id, self.target_container_id])
если я вернусь к сериализатору, то получу эту ошибку
Got AttributeError when attempting to get a value for field `display_sequence` on serializer `ContainerSequenceSwapSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `list` instance.
Original exception text was: 'list' object has no attribute 'display_sequence'.
Как я могу вернуть ожидаемый результат?
вот мои взгляды
Виды
class ContainerViewSet(viewsets.ModelViewSet):
"""Container ViewSet for CRUD operations."""
queryset = Container.objects.all()
def get_serializer_class(self):
return ContainerSerializerV1
@action(methods=["patch"], detail=True, url_path="swap-sequence")
def swap_sequence(self, request, pk):
# serializer = ContainerSequenceSwapSerializer(data=request.data)
container = self.get_object()
serializer = ContainerSequenceSwapSerializer(container, data=request.data, context={'container': container})
if serializer.is_valid(raise_exception=True):
# display data here
content = serializer.data
return Response(data=content, status=status.HTTP_200_OK)
Serializer
class ContainerSequenceSwapSerializer(serializers.ModelSerializer):
"""Serializer for Container sequence swap detail action."""
display_sequence = serializers.IntegerField()
# add class meta here to display id, swap sequence
class Meta:
model = Container
fields = (
"id",
"display_sequence",
)
read_only_fields = ("id", "display_sequence")
# sorting data
def to_representation(self, instance):
instance = Container.objects.filter(id__in=[self.container_id, self.target_container_id])
# data = super().to_representation(instance)
return instance
# custom validation
def validate(self, attrs):
display_sequence = super().validate(attrs)
container = self.context.get("container")
if not container:
return display_sequence
target_display_sequence = display_sequence["display_sequence"]
try:
target_container = Container.objects.get(
module=container.module, display_sequence=target_display_sequence
)
except Container.DoesNotExist:
raise serializers.ValidationError(
{"display_sequence": ["Invalid swap target"]}
)
else:
# switching
container.display_sequence, target_container.display_sequence = (
target_container.display_sequence,
container.display_sequence,
)
container.save()
target_container.save()
# datas
self.container_id = container.id
self.target_container_id = target_container.id
return display_sequence
как я могу вернуть ожидаемый вывод без изменения views.py
