В поле ответа DRF отображается список строк с обратными косыми чертами

Я создаю функцию Polls с помощью DRF, где пользователи могут создать опрос. Объект Response в postman для поля 'options' показывает список строк с обратными косыми чертами.

Вот ответ почтальона:

{
    "id": 17,
    "question": "Who will win the Fifa World Cup 2026 in USA ?",
    "options": "[\"Germany\",\"Argentina\",\"France\",\"Italy\",\"Brazil\",\"None of the above\"]",
    
}   

Мой код, который дает вышеуказанный результат :

//views.py// 
class Polls(APIView):
    permission_classes = (IsAuthenticated,)

    def put(self, request):
        request_data = request.data.dict()
        serializer = PollPostRequestSerializer(data=request_data, context={"request": request})
        serializer.is_valid(raise_exception=True)

        data = serializer.validated_data
        question = data.get('question')
        options = data.get('options')
        
        Poll = get_poll_model()

        poll = Poll.create_poll(question=question, options=options)

        poll_serialized = PollPostResponseSerializer(poll, many=False, context={"request": request}).data

        return Response(poll_serialized, status=status.HTTP_200_OK)


//Request serializer//
class PollPostRequestSerializer(serializers.Serializer):
    question = serializers.CharField(max_length=1000, required=True, allow_blank=True, allow_null=False)
    options = serializers.CharField(max_length=1000, required=True, allow_blank=True, allow_null=False)     
    
//Response serializer// 
class PollPostResponseSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = PollPost
        fields = (
            'id',
            'question',
            'options',
            )
    
//models.py//
class PollPost(models.Model):
    question = models.TextField(blank=False, null=False)
    options = models.TextField(blank=False, null=False)

    @classmethod
    def create_poll(cls, question, options):
       return cls.objects.create(question=question,options=options)

Моя цель - получить объект Response без обратных слешей. За помощь благодарен.

Здесь необходимо преобразовать список в строку JSON перед сохранением и Необходимо преобразовать строку JSON обратно в список при извлечении


# Update the PollPostRequestSerializer
from rest_framework import serializers

class PollPostRequestSerializer(serializers.Serializer):
    question = serializers.CharField(max_length=1000, required=True, allow_blank=True, allow_null=False)
    options = serializers.ListField(
        child=serializers.CharField(max_length=200), required=True
    )

# Update the PollPostResponseSerializer
class PollPostResponseSerializer(serializers.ModelSerializer):
    options = serializers.ListField(child=serializers.CharField())

    class Meta:
        model = PollPost
        fields = ('id', 'question', 'options')

# Update the PollPost Model
class PollPost(models.Model):
    question = models.TextField(blank=False, null=False)
    options = models.TextField(blank=False, null=False)

    @classmethod
    def create_poll(cls, question, options):
        # Convert the list to a JSON string before saving
        options_json = json.dumps(options)
        return cls.objects.create(question=question, options=options_json)

    def get_options(self):
        # Convert the JSON string back to a list when retrieving
        return json.loads(self.options)

# Modify the Response in the View
class Polls(APIView):
    permission_classes = (IsAuthenticated,)

    def put(self, request):
        serializer = PollPostRequestSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)

        data = serializer.validated_data
        question = data.get('question')
        options = data.get('options')

        Poll = get_poll_model()

        poll = Poll.create_poll(question=question, options=options)

        # Deserialize options before sending response
        poll_serialized = PollPostResponseSerializer(poll, many=False, context={"request": request}).data
        poll_serialized['options'] = json.loads(poll_serialized['options'])

        return Response(poll_serialized, status=status.HTTP_200_OK)


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