Фильтр поиска django drf - PullRequest
       4

Фильтр поиска django drf

0 голосов
/ 17 января 2020

Я хочу получить изображение как несколько ключевых слов для поиска одновременно:

views.py:

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

models.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

urls.py :

    path('image_search/',views.ImageSearchView.as_view(), name = 'image_search'),

, когда я делаю запрос от почтальона:

localhost:8000/api/image_search?search=boxing cricket kohli marykom

, если я ставлю & между ними, это также не работает:

enter image description here я хочу получить каждое изображение с ключевым словом, как у любого из параметров поиска

Ответы [ 3 ]

0 голосов
/ 17 января 2020

The django-rest-framework-filters package works together with the DjangoFilterBackend class, and allows you to easily create filters across relationships, or create multiple filter lookup types for a given field.

читать там

что часть документов для вас, я думаю

title__startswith=Who, title__startswith=What title__startswith%3DWho, title__startswith%3DWhat (title__startswith%3DWho) | (title__startswith%3DWhat) %28title__startswith%253DWho%29%20%7C%20%28title__startswith%253DWhat%29 filters=%28title__startswith%253DWho%29%20%7C%20%28title__startswith%253DWhat%29

0 голосов
/ 17 января 2020

Вы пытались задать поисковый параметр несколько раз, как это? В этом случае параметр поиска должен быть в конце списка.

localhost:8000/api/image_search?search=&search=boxing&search=cricket&search=kohli&search=marykom
0 голосов
/ 17 января 2020

Я предлагаю вам использовать 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

В этом случае обязательно удалите поля filter_backends, search_fields и queryset из ImageSearchView class

...