Django-rest-framework filter_queryset() takes 3 positional arguments but 4 were given

2.4k views Asked by At

I am using django-rest-framework in my application. And I am getting following error with this serializer. What I missed here? Got error when validating serializer

serializer = self.get_serializer(data=request.data.get('data'))
serializer.is_valid(raise_exception=False)
print (serializer.initial_data)

But when printing serializer.initial_data it prints the request which I sent as,

{'step3': True, 'first_last_name': 'Testing FN1', 'email': '[email protected]', 'gender': 0, 'state': 76, 'birthday': 766261, 'username': 'Testing 1', 'password': 'Test@dev123'}

In Views.py

def registration_flow(self, request):
        request.data.get('data', {})['email'] = request.data.get('data', {}).get('email', '').lower()
        serializer = self.get_serializer(data=request.data.get('data'))
        first_last_name = request.data.get('data', {}).get(
            'first_last_name')
        if first_last_name:
            first_last_name = first_last_name.strip()
            if " " not in first_last_name:
                serializer.initial_data['firstName'] = first_last_name
            else:
                names_list = first_last_name.split(" ")
                names_list = [x for x in names_list if x]
                firstName = names_list[0]
                lastName = names_list[1]
                serializer.initial_data['firstName'] = firstName
                serializer.initial_data['lastName'] = lastName
        
        if step1 == 1:
            if get_user_model().objects.filter(email__iexact=email).exists():
                raise ValidationError({"email": [UNIQUE_EMAIl]})
        if step3 == 1:
            if get_user_model().objects.filter(email__iexact=email).exists():
                raise ValidationError({"email": [UNIQUE_EMAIl]})
            if 'finao' in username.lower():
                raise ValidationError({"username": [CONTAIN_FINAO_ERROR]})
            if get_user_model().objects.filter(username=username.lower()).exists():
                raise ValidationError({"username": [UNIQUE_USERNAME]})
            if not password:
                raise ValidationError({'password': ['Password required']})
            else:
                if len(password) < 8:
                    raise ValidationError({'password': ['Short Password']})
                required_symbols = ['?', '/', '#', '&', '%', '$', '@']
                required_symbols += [letter for letter in string.digits]
                required_symbols += [letter for letter in
                                     string.ascii_uppercase]
                if not any(unit in required_symbols for unit in password):
                    raise ValidationError([error_msg])
        serializer.is_valid(raise_exception=True)
        self.perform_create(serializer)
        serializer.instance.set_password(password)
        serializer.instance.save()
        return Response({'data': serializer.instance.auth_token.key})

    

Error:

  File "/user/django/venv_py3/lib/python3.6/site-packages/rest_framework/serializers.py", line 220, in is_valid
    self._validated_data = self.run_validation(self.initial_data)
  File "/user/django/venv_py3/lib/python3.6/site-packages/rest_framework/serializers.py", line 419, in run_validation
    value = self.to_internal_value(data)
  File "/user/django/venv_py3/lib/python3.6/site-packages/rest_framework/serializers.py", line 476, in to_internal_value
    validated_value = field.run_validation(primitive_value)
  File "/user/django/venv_py3/lib/python3.6/site-packages/rest_framework/fields.py", line 799, in run_validation
    return super().run_validation(data)
  File "/user/django/venv_py3/lib/python3.6/site-packages/rest_framework/fields.py", line 569, in run_validation
    self.run_validators(value)
  File "/user/django/venv_py3/lib/python3.6/site-packages/rest_framework/fields.py", line 591, in run_validators
    validator(value, self)
  File "/user/django/venv_py3/lib/python3.6/site-packages/rest_framework/validators.py", line 71, in __call__
    queryset = self.filter_queryset(value, queryset, field_name)
TypeError: filter_queryset() takes 3 positional arguments but 4 were given
1

There are 1 answers

0
Malik On

Make sure you are using filter_backends FilterBackend and filterset_class may be your custom FilterSet class

ps: answer for our descendants)