Kumar
Kumar

Reputation: 181

Django rest Framework - Expected a list of items but got type "QuerySet"

I try to serialize query set. But Im getting {'non_field_errors': [ErrorDetail(string='Expected a list of items but got type "QuerySet".', code='not_a_list')]} error. How to solve this error.

    def post(self, request):
        data = request.data
        user_name = data.get('username')
        signup_filtered_data = Signup.objects.filter(username= user_name).values()
        print(signup_filtered_data)
        serializer = SignupSerializer(data= signup_filtered_data, many=True)
        serializer.is_valid()
        print(serializer.errors)
        signup_jason_data = json.dumps(serializer.data)
        return HttpResponse(signup_jason_data)

models.py

class Signup(models.Model):
    first_name = models.CharField(max_length=50, blank=True, null=True)
    last_name = models.CharField(max_length=50, blank=True, null=True)
    email = models.EmailField(max_length=50, unique= True)
    phone_number = models.CharField(max_length=12, unique= True)
    username = models.CharField(max_length=50, unique= True)
    password = models.CharField(max_length=50, blank=True, null=True)

serializers.py

class SignupSerializer(serializers.ModelSerializer):

    class Meta:
        model = Signup
        fields = '__all__'

Upvotes: 3

Views: 8940

Answers (2)

Carlos Carvalheira
Carlos Carvalheira

Reputation: 146

A Much cleaner approach is using filters and serializer with a class-based view A example of that is using mixins.

Mixins DjangoRest

FilterBackend DjangoRest

Pagination DjangoRest

Permissions Classes DjangoRest

filters.py

class SignupFilter(django_filters.FilterSet):

    class Meta:
        model = Signup
        fields = [
            'user_name',
        ]

views.py

class YourNameView(mixins.CreateModelMixin,
                   viewsets.GenericViewSet):

    permission_classes = [permissions.IsAuthenticated, ] # Permission Classes
    pagination_class = PageNumberPagination # Pagination Classes
    serializer_class = SignupSerializer # Your Serializer
    filter_backends = [DjangoFilterBackend] #This need to added on settings.py
    filter_class = SignupFilter # Your filter Class
    queryset = Signup.objects.all() 

    def post(self, request, *args, **kwargs):
        return self.create(request, *args, **kwargs)

Upvotes: 1

Rakibul Islam
Rakibul Islam

Reputation: 1022

It is that you have used many = True in the view when you pass the data to the serializer, but you are in fact only sending a single message.

def post(self, request, formate = None):
   serializer = SignupSerializer(data= signup_filtered_data)

See the actual answer: Actual answer

Upvotes: 2

Related Questions