Я бы сделал так:
models.pyclass PageHit(models.Model):
url = models.CharField(unique=True)
count = models.PositiveIntegerField(default=0)
decorators.pyfrom functools import wraps
from django.db.models import F
from django.db import transaction
def counted(f):
@wraps(f)
def decorator(request, *args, **kwargs):
with transaction.atomic():
counter, created = PageHit.objects.get_or_create(url=request.path)
counter.count = F('count') + 1
counter.save()
return f(request, *args, **kwargs)
return decorator
views.pyfrom .decorators import counted
@counted
def some_view(request):
...
Репозиторий демонстрационного проекта.
Или можно написать middleware, который будет делать то же самое для всех запросов.