0

I am trying to make a user search for images, I have gone through the doc but I can't understand. I have installed Django-filter but I am getting this error

Traceback (most recent call last):
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\django\views\generic\base.py", line 68, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\rest_framework\views.py", line 495, in dispatch
    response = self.handle_exception(exc)
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\rest_framework\views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\rest_framework\views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\rest_framework\generics.py", line 201, in get
    return self.list(request, *args, **kwargs)
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\rest_framework\mixins.py", line 47, in list
    serializer = self.get_serializer(queryset, many=True)
  File "C:\Users\dokunbam\Documents\python\instagram-clone\env\lib\site-packages\rest_framework\generics.py", line 112, in get_serializer
    return serializer_class(*args, **kwargs)
TypeError: __init__() got an unexpected keyword argument 'many'

The goal is for users to search or filter posts by 'tags','owner' or 'image_url'

Comment model

class Photo(models.Model):
    post = models.TextField(max_length=140, default="")
    image_file = models.ImageField(upload_to='public/images', default='image.png')
    image_url = models.CharField(max_length=140, default='image.png')
    date_uploaded = models.DateTimeField(auto_now=True)
    owner = models.ForeignKey('auth.User', on_delete=models.CASCADE,)
    tags = models.CharField(max_length=10, default='img')

    class Meta:
        ordering = ('date_uploaded',)

    def __str__(self):
        return self.post

view.py

class PhotoSearchList(generics.ListAPIView):
    model = Photo
    serializer_class = PhotoFilterSerializer
    queryset = Photo.objects.all()
    filter_backends = (filters.SearchFilter,)
    filter_fields = ('tags', 'date_uploaded')

Serializer.py

class PhotoFilterSerializer(filters.FilterSet):
    class Meta:
        model = Photo
        fields = ('tags', 'date_uploaded')

urls.py

path('search/', views.PhotoSearchList.as_view()),

In the settings I added this as mentioned in the doc

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('django_filters.rest_framework.DjangoFilterBackend',)
}

I have also added 'django_filters' to INSTALLED_APPS in the setting

4
  • As per the code snippet is given, the mentioned error won't get. Please add the error traceback Commented Feb 10, 2019 at 3:12
  • apart from that, the django-filter package provides proper documentation regarding the filtering and searching process Commented Feb 10, 2019 at 3:16
  • The error traceback is included Commented Feb 10, 2019 at 7:26
  • If you're using the searchfilter then you need to specify the search_fields not filter_fields Commented Feb 10, 2019 at 15:43

1 Answer 1

1

The issue here is that your PhotoFilterSerializer is extending the wrong class. It's extending FilterSet when it should be extending ModelSerializer.

Change it to:

from rest_framework import serializers

class PhotoFilterSerializer(serializers.ModelSerializer):
    ...

If you wish to use a dedicated FilterSet class, you could create a PhotoFilter:

from django_filters import rest_framework as filters

class PhotoFilter(filters.FilterSet):

    class Meta:
        model = Photo
        fields = ('tags', 'date_uploaded')

And then specify that separately on your view using the filterset_class attribute:

class PhotoSearchList(generics.ListAPIView):
    ...
    serializer_class = PhotoFilterSerializer
    filterset_class = PhotoFilter
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.