0

Im trying to create a Question Model Serializer. The Question model has several other models that inherit from it like RangeQuestion, YesNoQuestion, etc..

This is my view:

class QuestionViewSet(generics.ListCreateAPIView):
    """
    A viewset that provides `create` actions.
    """
    queryset = Question.objects.all()

    def get_serializer_class(self):
        if 'type' in self.request.data:
            if self.request.data['type'] == 'range':
                return serializers.RangeQuestionSerializer
            elif self.request.data['type'] == 'open':
                return serializers.QuestionSerializer
            elif self.request.data['type'] == 'multiple_choice':
                return serializers.MultipleChoiceQuestionSerializer
            elif self.request.data['type'] == 'yes_no':
                return serializers.YesNoAnswerSerializer
            elif self.request.data['type'] == 'object':
                return serializers.ObjectQuestionSerializer
        else:
            return serializers.QuestionSerializer

    def create(self, request):
        if 'type' in self.request.data:
            serializer = self.get_serializer(data=self.request.data)
            print serializer
            serializer.is_valid(raise_exception=True)
            serializer.save()
            headers = self.get_success_headers(serializer.data)
            return Response(
                serializer.data,
                status=status.HTTP_201_CREATED,
                headers=headers)
        else:
            return Response(status=HTTP_400_BAD_REQUEST, data="Must specify a question type")

And this are my serializers:

class QuestionSerializer(serializers.ModelSerializer):
    type = serializers.SerializerMethodField()

    def get_type(self):
        return settings.QUESTION_TYPES['open']

    class Meta:
        model = Question
        exclude = []


class YesNoQuestionSerializer(serializers.ModelSerializer):
    type = serializers.SerializerMethodField()

    def get_type(self):
        return settings.QUESTION_TYPES['yes_no']

    class Meta:
        model = YesNoQuestion
        exclude = []


class RangeQuestionSerializer(serializers.ModelSerializer):
    type = serializers.SerializerMethodField()

    def get_type(self):
        return settings.QUESTION_TYPES['range']

    class Meta:
        model = RangeQuestion
        exclude = []


class QuestionChoiceSerializer(serializers.ModelSerializer):

    class Meta:
        model = QuestionChoice
        exclude = []


class MultipleChoiceQuestionSerializer(serializers.ModelSerializer):
    choices = QuestionChoiceSerializer()
    type = serializers.SerializerMethodField()

    def get_type(self):
        return settings.QUESTION_TYPES['multiple_choice']

    class Meta:
        model = MultipleChoiceQuestion
        exclude = []

When I acces the url of the list action I get the error:

get_type() takes exactly 1 argument (2 given)

Can anyone tell me how to make the list view show all the question serialized according to the subclass?

1 Answer 1

1

Your def get_type(self) method should be defined def get_type(self, instance) because rest framework serializers will pass in the instance as the first argument.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.