Я создаю приложение Django и хотел бы показать некоторую статистику на главной странице, такую как общее количество транзакций, процент успешных транзакций, ежедневное количество активных пользователей и т. Д.
Я нехочу вычислять эти значения в представлении каждый раз, когда пользователь запрашивает главную страницу по соображениям производительности.Я подумал о 2 возможных решениях.
(1) Создайте несколько таблиц с одной записью
Создайте таблицу для каждой статистики, например:
from django.db import models
class LastSuccessfulTransactionDate(models.Model):
date = models.DateTimeField()
class TotalTransactionAmount(models.Model):
total_amount = models.DecimalField(max_digits=8, decimal_places=2)
# ...
и убедитесь, что в каждой таблице существует только одна запись.
(2) Создайте таблицу с данными значения ключа
class Statistics(models.Model):
key = models.CharField(max_length=100)
value = models.TextField()
и сохраните данные, выполнив:
from datetime import datetime
from decimal import Decimal
import pickle
statistics = {
'last_successful_transaction_date': datetime(2010, 2, 3),
'total_transaction_amount': Decimal('1234.56'),
}
for k, v in statistics.items():
try:
s = Statistics.objects.get(key=k)
except Statistics.DoesNotExist:
s = Statistics(key=k)
s.value = base64.b64encode(pickle.dumps(v, pickle.HIGHEST_PROTOCOL)).decode()
s.save()
и извлеките по:
for s in Statistics.objects.all():
k = s.key
v = pickle.loads(base64.b64decode(s.value.encode()))
print(k, v)
В обоих случаях данные будут время от времени обновляться заданием cron (они недолжен быть очень точным).
Для меня решение (2) выглядит лучше, потому что для отображения главной страницы мне нужно было бы получать данные только из таблицы Statistics
, а не из числа из одной записистолы.Есть ли рекомендуемое решение этой проблемы?Спасибо