Циклические операции в 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 лямбда функцию для получения аналитических данных, все эти решения зависят от вашего случая
Это псевдорешение. надеюсь, оно было полезным для вас