Как сделать динамическое количество Q запросов?
Untiwe я доработал твой код.
Вся хитрость в 2х звёздочках **
def get_queryset(self):
        if not self.request.GET:
            return Posts.objects.all()#если нет параметров, просто возвращаем все посты
        keyword = self.request.GET.get('key')#получаем ключевое слово
        filters = Q()#создаем первый объект Q, что бы складывать с ним другие
        for key in ['author', 'name', 'text']:
                value = self.request.GET.get(key)
                if value:
                        filters |= Q(**{f'{key}__icontains': keyword})
        return Posts.objects.filter(filters)
Ответ Dr. Bacon не совсем понял, но сделал вот так. Если кому надо, у меня идет определение класса от ListView и определение метода get_queryset. Данный пример не работает сам по себе, но показывает идею

def get_queryset(self):
        if not self.request.GET:
            return Posts.objects.all()#если нет параметров, просто возвращаем все посты

        keyword = self.request.GET.get('key')#получаем ключевое слово
        author= self.request.GET.get('author')#если параметра нет, get() вернет None что равняется False
        name = self.request.GET.get('name')#если параметра нет, get() вернет None что равняется False
        text = self.request.GET.get('text')#если параметра нет, get() вернет None что равняется False
        filters = Q()#создаем первый объект Q, что бы складывать с ним другие
        if author:
            filters |= Q(name__icontains=keyword )
        if name:
            filters |= Q(name__icontains=keyword )
        if text:
            filters |= Q(name__icontains=keyword )
        
        return Posts.objects.filter(filters)