搜索过滤器 django drf

afk*_*afk 1 python django django-rest-framework

我想一次获取图像作为多个搜索关键字:

视图.py:

class ImageSearchView(generics.ListAPIView):
      authentication_classes = []
      permission_classes = []
      queryset = Image.objects.all()
      serializer_class = ImageSearchSerializer
      filter_backends = (filters.SearchFilter,)
      search_fields = ['image_keyword']
Run Code Online (Sandbox Code Playgroud)

模型.py:

class Image(models.Model):
      license_type = (
         ('Royalty-Free','Royalty-Free'),
         ('Rights-Managed','Rights-Managed')
       )
      image_number = models.CharField(default=random_image_number,max_length=12,unique=True)
      title = models.CharField(default=random_image_number,max_length = 100)
      image = models.ImageField(upload_to = 'image' , default = 'demo/demo.png')
      thumbnail = models.ImageField(upload_to='thumbs', blank=True, null=True)
      category = models.ForeignKey('Category', null=True, blank=True, on_delete=models.CASCADE)
      shoot = models.ForeignKey(ImageShoot, on_delete=models.CASCADE, related_name='Image', null=True,blank=True)
      image_keyword = models.TextField(max_length=1000)


      def __str__(self):
         return self.title
Run Code Online (Sandbox Code Playgroud)

网址.py:

    path('image_search/',views.ImageSearchView.as_view(), name = 'image_search'),
Run Code Online (Sandbox Code Playgroud)

当我向邮递员提出请求时:

localhost:8000/api/image_search?search=boxing cricket kohli marykom
Run Code Online (Sandbox Code Playgroud)

如果我把 & 放在它们之间,那么它也不起作用:

在此输入图像描述 我想获取每个具有像任何搜索参数一样的关键字的图像

vad*_*imb 5

我建议您使用django-filter这种情况,您可以在这里阅读更多信息:

https://www.django-rest-framework.org/api-guide/filtering/#djangofilterbackend

https://django-filter.readthedocs.io/en/latest/guide/rest_framework.html

如果您不想安装任何东西 - 您可以get_queryset覆盖ListAPIView. 您需要获取所需的所有查询参数并返回经它们过滤的查询集。在这种情况下,您的代码将如下所示:

def get_queryset(self, request, *args, **kwargs):
    queryset = Image.objects.all()
    keywords = self.request.query_params.get('search')
    if keywords:
        queryset = queryset.filter(image_keyword__in=keywords.split(','))
    return queryset
Run Code Online (Sandbox Code Playgroud)

在这种情况下,请确保从类中删除filter_backends,search_fieldsqueryset 字段ImageSearchView