Джанго сессии. Перенос последних просмотренных товаров в шаблон

Я хочу сделать функцию показа последних просмотренных товаров через сессии. Проблема в том, что я не могу нормально отфильтровать эти товары. Они идут не по порядку. Я вижу, что все дело в строке recently_viewed_products = Product.objects.filter(slug__in=request.session['recently_viewed']), ибо выводя в консоль "оригинальный список"(print(request.session['recently_viewed'])) работает все так, как мне и нужно. Я недавно начал изучать сессии и пока не понимаю, как по другому переписать логику работы, чтобы работало все так, как мне нужно.

Вот сам код в views.py

class Detail(DetailView):
model = Product
template_name = 'app/detail.html'
context_object_name = 'product_detail'
slug_url_kwarg = 'product_slug'

def get(self, request, *args, **kwargs):
    global recently_viewed_products
    recently_viewed_products = None
    # request.session['recently_viewed'].clear()
    if 'recently_viewed' not in request.session:
        request.session['recently_viewed'] = [self.kwargs['product_slug']]
    else:
        if self.kwargs['product_slug'] in request.session['recently_viewed']:
            request.session['recently_viewed'].remove(self.kwargs['product_slug'])
            request.session['recently_viewed'].append(self.kwargs['product_slug'])
            print(request.session['recently_viewed'])
        else:
            request.session['recently_viewed'].append(self.kwargs['product_slug'])
            print(request.session['recently_viewed'])

    recently_viewed_products = Product.objects.filter(slug__in=request.session['recently_viewed'])
    print(recently_viewed_products)
    request.session.modified = True

    return super().get(request, *args, **kwargs)

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    Product.objects.filter(slug=self.kwargs['product_slug']).update(views=F('views') + 1)
    context['recently'] = recently_viewed_products
    return context

def get_queryset(self):
    return Product.objects.filter(draft=False)

В общем решил проблему так. Сначала дополнил модель товара новым полем last_visit = models.TimeField(blank=True, null=True). Далее в views.py импортировал datetime(from datetime import datetime). В контексте вьюхи самого товара прописал обновление поля last_visit - self.object.last_visit = datetime.now() self.object.save(), что бы время обновлялось при каждом обращении к странице. В recently_viewed_products добавил order_by, в нем сортировку по полю last_visit - recently_viewed_products = Product.objects.filter(slug__in=request.session['recently_viewed']).order_by('last_visit')

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