Я предлагаю использовать для этого специальный пакет с именем django-postgres-fuzzycount
[GitHub] .Этот пакет предоставляет менеджер, который будет выполнять быстрый подсчет.
Вы можете установить пакет с помощью pip
(например, в вашей локальной среде):
$ pip install django-postgres-fuzzycount
Затем вы можете добавить`` к моделям, где вы хотите получить приблизительный счет:
from django.db import models
from fuzzycount import <b>FuzzyCountManager</b>
class SomeModel(models.Model):
# ... (some fields) ...
objects = models.Manager()
<b>approx</b> = FuzzyCountManager()
, а затем вы можете приблизительный счет с помощью:
SomeModel.approx.count()
В случае, если вы .filter(..)
, Django рассчитает действительное число, поскольку в таблице pg_class
хранится только приблизительно число строк для таблицы вся , поэтому:
SomeModel.approx.filter(foo=bar).count()
займет больше времени (в зависимости от индексов и т. д.).
Вы также можете напрямую "пропатчить" менеджера objects
, но затем получить количество записей real может быть сложнее:
from django.db import models
from fuzzycount import FuzzyCountManager
class SomeModel(models.Model):
# ... (some fields) ...
<b>objects</b> = FuzzyCountManager()
Также приятно, что если вы измените внутреннюю базу данных на другую, FuzzyCountManager(..)
будет действовать как normal Manager
, поэтому, если вы позже измените систему базы данных, вы сделаетене надо переписывать менеджеров.