Как добавить 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. как этого добиться???