Циклические операции в Django Rest Framework

В моем фронтенд-приложении есть панель, которая показывает 6 самых популярных товаров на моем сайте. Поиск самых популярных товаров по каждому запросу по количеству просмотров может быть дорогостоящим. Я думаю, что хорошим способом улучшить это будет создание таблицы в моей базе данных, которая будет хранить 6 самых популярных продуктов, и таблица будет обновляться, например, каждую минуту. Что я должен искать для выполнения такой циклической операции на моем бэкенде django?

Вы можете создать отдельную модель

models.py

class ProductRecord(models.Model):

    product = models.OneToOneField(
        'Product'
        related_name='stats', on_delete=models.CASCADE)

    # Data used for generating a score
    num_views = models.PositiveIntegerField(default=0)
    num_basket_additions = models.PositiveIntegerField(
        default=0)
    num_purchases = models.PositiveIntegerField(
        default=0)

    # Product score - used within search
    score = models.FloatField(default=0.00)

    def __str__(self):
        return _("Record for '%s'") % self.product

rule_engine.py

class Calculator:
    weights = {
        'num_views': 1,
        'num_basket_additions': 3,
        'num_purchases': 5
    }

    def calculate_scores(self):
        total_weight = float(sum(self.weights.values()))
        weighted_fields = [
            self.weights[name] * F(name) for name in self.weights.keys()]
        ProductRecord.objects.update(
            score=sum(weighted_fields) / total_weight)

receivers.py

Здесь у вас будет несколько сигналов для получения добавлений в корзину, просмотров, избранных и так далее...

Это пример

def receive_product_view(sender, product, user, **kwargs):
   UserProductView.objects.create(product=product, user=user)
   ## yyou can do much advanced staff here using signals 

Другое решение

Вы можете использовать Redis для сохранения таких данных, как подсчеты и покупки. Или сделать aws лямбда функцию для получения аналитических данных, все эти решения зависят от вашего случая

Это псевдорешение. надеюсь, оно было полезным для вас

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