Как добавить Q-поиск с помощью get_queryset в Django rest framework?

Я написал некоторый код фильтрации в функции get_qeuryset. Также у меня есть отдельный поисковый фильтр api, который осуществляет поиск на основе строки, указанной в параметре запроса search. Теперь я хочу добавить поисковый запрос в прежнюю логику фильтрации, чтобы пользователь мог искать только в отфильтрованных результатах, а не во всей базе данных снова.

Моя модель:

class Product(models.Model):
   
    WARRANTY = (
        ('no_warranty', 'No Warranty',),
        ('local_seller_warranty', 'Local Seller Warranty',),
        ('brand_warranty', 'Brand Warranty',),
    )
    
    merchant = models.ForeignKey(Seller,on_delete=models.CASCADE,blank=True,null=True)
    category = models.ManyToManyField(Category, blank=False)
    sub_category = models.ForeignKey(Subcategory, on_delete=models.CASCADE,blank=True,null=True)
    mini_category = models.ForeignKey(Minicategory, on_delete=models.SET_NULL, blank=True, null=True)
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE)
    collection = models.ForeignKey(Collection, on_delete=models.CASCADE)
    featured = models.BooleanField(default=False)  # is product featured?

    /.........other codes.........../

Мой взгляд на фильтрацию:

class ProductAPIView(ListAPIView):
    permission_classes = [AllowAny]
    serializer_class = ProductSerializer
    queryset = Product.objects.all()    
    pagination_class = CustomPagination

    def get_queryset(self):
        brand = self.request.GET.get('brand', None)
        sub_category = self.request.GET.get("sub_category", None)
        warranty = self.request.GET.get("warranty", None)
        if brand is not None:
            
            brand_values = brand.split(",")
            if sub_category is not None:
                
                sub_category_values = sub_category.split(",")
                if warranty is not None:
                    
                    warranty_values = warranty.split(",")
                    return Product.objects.filter(brand__name__in=brand_values,
                                                  sub_category__name__in=sub_category_values,
                                                  warranty__in=warranty_values)
         /..........other codes........../

Мой url для вызова этого

localhost/api/products?brand=Samsung,Lg&warranty=no_warranty

Q просмотр поиска:

from django.db.models import Q
class PrdouctSearchAPIView(ListAPIView):
    permission_classes = [AllowAny]
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    pagination_class = CustomPagination

    
    def get_queryset(self):
        qur = self.request.query_params.get('search')
        item = Product.objects.filter(Q(category__name__icontains=qur) |
                                          Q(brand__name__icontains=qur) |
                                          Q(description__icontains=qur) |
                                          Q(collection__name__icontains=qur) |
                                          Q(name__icontains=qur) |
                                          Q(variants__color__icontains=qur)).distinct()

        return item

url для выполнения этого просмотра:

localhost/api/productsearch?search=frontload

Теперь я хочу объединить эти два api, например localhost/api/products?brand=Samsung мне нужно отобразить только машины марки Samsung. Теперь, когда я добавляю search=frontload в тот же api localhost/api/products?brand=Samsung&search=frontload например, мне нужно отобразить машины samsung только с frontload. как этого добиться???

Вернуться на верх