@NyxDeveloper

Как реализовать поиск с запоминанием предыдущих запросов?

Делаю поиск по таблице, над каждым столбцом которой находится поисковая формочка для каждого поля модели (каждого столбца). Поиск работает отлично, но нужно добавить что-то вроде кэша, чтобы предыдущие параметры поиска сохранялись. Т.к. функция поиска и сортировки универсальна для каждой модели, я хочу сделать так чтобы и кэширование было универсальным. Раньше для создания кэша использовалась модель, соответствующая модели таблицы.
Пример:
модель кэша
class CacheContact(models.Model):
    user = models.CharField('user', max_length=200, default='')
    firstName = models.CharField('Имя', max_length=150, blank=True, default='')
    lastName = models.CharField('Фамилия', max_length=150, blank=True, default='')
    middleName = models.CharField('Отчество', max_length=150, blank=True, default='')
    idContr = models.CharField('Контрагент', max_length=150, blank=True, default='')
    idDolj = models.CharField('Должность', max_length=150, blank=True, default='')
    description = models.TextField('Примечание', max_length=2000, blank=True)

    class Meta:
        verbose_name = 'Контакт'
        verbose_name_plural = 'Контакты'

    def __str__(self):
        return self.firstName + ' ' + self.middleName + ' ' + self.lastName


модель реального объекта
#   контакт
class Contact(models.Model):
    firstName = models.CharField('Имя', max_length=150)
    lastName = models.CharField('Фамилия', max_length=150)
    middleName = models.CharField('Отчество', max_length=150, blank=True)
    idContr = models.ForeignKey(Kontragent, verbose_name='Контрагент', on_delete=models.SET_NULL, null=True)
    idDolj = models.ForeignKey(Dolj, verbose_name='Должность', on_delete=models.SET_NULL, null=True)
    description = models.CharField('Примечание', max_length=2000, blank=True)

    class Meta:
        verbose_name = 'Контакт'
        verbose_name_plural = 'Контакты'

    def __str__(self):
        return self.firstName + ' ' + self.middleName + ' ' + self.lastName


Таких моделей было очень много, т.к. по факту каждую модель таблицы нужно было дублировать и все поля заменять на CharField. Я хочу сделать что-то более универсальное, типа сохранение предыдущего запроса в виде строки или объекта и доставать оттуда параметры для каждой таблицы. Пока не знаю как именно это сделать, может быть уже есть готовое решение, а может кто-то подскажет как было бы лучше реализовать такой объект, а может и не объект, а вовсе функцию, работающую в реалтайме. Функция поиска и сортировки у меня выглядит так:
def search_and_sort(request, list, instance, cache_instance):
    #   перебор всех параметров, переданных в request.GET
    for setting in request.GET:
        #   проверка на параметр сортировки
        if setting == 'sorted' or setting == 'resort':
            #   если нужно отсортировать от большего к меньшему
            if setting == 'sorted' and request.GET.get(setting) is not '':
                list = list.order_by('-'+request.GET.get(setting))
            #   если нужно отсортировать от меньшего к большему
            else:
                list = list.order_by(request.GET.get(setting))
        #   если это параметр поиска
        else:
            #   список полей переданного объекта
            if request.GET.get(setting) is None or request.GET.get(setting) is '':
                continue
            fields = instance._meta.get_fields()
            for field in fields:
                if field.name == setting:
                    #   если имя поля совпадает с параметром поиска фильтруем список по значению из параметра поиска
                    #   и выходим из цикла чтобы экономить время
                    if field.many_to_one or field.one_to_many:
                        filter_kwargs = {'%s__id' % field.name: request.GET.get(setting)}
                    else:
                        filter_kwargs = {'%s__icontains' % field.name: request.GET.get(setting)}

                    list = list.filter(**filter_kwargs)
                    break
    return list


Нужно отдавать в нее параметром объект кэша, проверять есть ли в настоящем запросе новые поля или нет, если нет, то брать поля из кэша, а если да, то заменять параметры в кэше на поля из запроса. Подскажите пожалуйста, как мне реализовать такой функционал?
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы