django-basemodels
django-basemodels — небольшой, но гибкий пакет для Django, который предоставляет абстрактную базовую модель с:
- поддержкой полиморфизма (через
django-polymorphic); - безопасного удаления (soft-delete) через
django-safedelete; - полями и утилитами для управления активности записей (
is_active,active_start,active_end); - массовыми операциями и менеджером/QuerySet с полезными методами (
active(),inactive(),activate(),deactivate(),update_activity_status()); - интеграцией с Celery для периодического обновления статуса активности.
Проект спроектирован как drop-in база для ваших моделей: вы наследуете BaseModel, и получаете все возможности готовой логики управления состоянием и удаления.
Особенности
- Абстрактная
BaseModel— готовые поля:created_at,updated_at,is_active,active_start,active_end. - Менеджер
objectsподдерживает soft-delete черезdjango-safedelete. - Полиморфизм через
django-polymorphic. - Удобные массовые методы:
activate(),deactivate(),active(),inactive(). - Задача celery для периодического обновления is_active у моделей:
django_basemodels.update_activity_status - Поддержка конфигурации
django_celery_beat— при наличии создаётся периодическая задача.
Требования
- Python >=3.12
- Django >=5.0
django-polymorphicdjango-safedelete- (опционально)
celeryиdjango_celery_beatдля автоматического обновления активности - (опционально)
celery_hchecker— для проверки состояния Celery в рантайме (если используется)
Установка
Базовая установка (без Celery)
pip install django-basemodels
С поддержкой Celery
pip install django-basemodels[celery]
Функции, доступные только в Celery:
- Автоматическое обновление статуса активности
- Периодические задачи через django-celery-beat
- Проверка здоровья celery
Добавьте в INSTALLED_APPS в settings.py:
INSTALLED_APPS = [
# ...
"polymorphic",
"safedelete",
"django_basemodels",
# ...
]
Быстрый старт
Определение модели:
from django.db import models
from django_basemodels.models import BaseModel
class Article(BaseModel):
title = models.CharField(max_length=255)
body = models.TextField()
Использование менеджера и методов:
# получение активных записей (в зависимости от состояния Celery — по флагу is_active или по временным полям)
Article.objects.active()
# массовая деактивация
Article.objects.deactivate()
# массовая активация
Article.objects.activate()
# вручную обновить is_active для всех записей по правилам active_start/active_end
Article.objects.update_activity_status(batch_size=500)
Доступ ко всем (включая удаленные) объектам:
Article.all_objects.all() # видимы даже soft-deleted при DELETED_VISIBLE
Article.deleted_objects.all()
Краткое API
BaseModel (абстрактный)
created_at,updated_at— авто-поля времени.is_active,active_start,active_end— управление активности.activate()/deactivate()— изменения с сохранениемupdated_at.is_active_real— вычисление активности (учитывает состояние Celery).
BaseModelQuerySet / BaseModelManager
update(**kwargs)— при массовом обновлении ставитupdated_at = now().active()/inactive()— возвращает элементы в зависимости от доступности Celery (по флагу или по временным полям).update_activity_status(batch_size=1000)— пересчитываетis_activeбатчами, используетbulk_update.
Celery и django_celery_beat
- Задачи:
django_basemodels.update_model_activity(model_label)иdjango_basemodels.update_activity_status(). - При наличии
django_celery_beatпакет попытается создать периодическую задачу после миграций. - Для проверки состояния Celery используется
celery_hchecker. Если он не инициализирован,active()будет полагаться на временные поля.
Тестирование (pytest)
Рекомендуемая структура проекта: src/ + tests/ (poetry default). Установите pytest и pytest-django и запустите:
poetry add --dev pytest pytest-django
poetry run pytest -q
Примеры важных замечаний при тестировании:
- Если
query.pyиспользуетfrom .utils import celery_is_healthy, то в тестах патчить нужноdjango_basemodels.query.celery_is_healthy. - Альтернативно, поменяйте импорт в
query.pyнаfrom . import utilsи патчьтеdjango_basemodels.utils.celery_is_healthy.
Практические советы
update_activity_statusрассчитан на большую нагрузку (батчи +bulk_update). Настройтеbatch_sizeпод вашу БД.- Добавьте логирование в задачи Celery в продакшене для мониторинга числа обновлённых записей.
- Для крупных таблиц рассмотрите частичные индексы (Postgres) по условию активности.
Лицензия
MIT
Metadata
Release files for django-basemodels 0.0.6
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| django_basemodels-0.0.6.tar.gz | 10.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| django_basemodels-0.0.6-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 23.1 kB
Release files / django_basemodels-0.0.6.tar.gz
| Download URL | django_basemodels-0.0.6.tar.gz |
|---|---|
| Size | 10.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
154979dd58b8010e5ac3ad454c7f4101e50685e0b1d81d23b5b8cc4b03d152f0
|
|
BLAKE2b-256 checksum How to use checksums |
5bbfe9112c6fb8093128d969d1149fbda0e3b596b8c28d528fb1799b4141e543
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.2.0 CPython/3.13.0 Windows/11
|
Release files / django_basemodels-0.0.6-py3-none-any.whl
| Download URL | django_basemodels-0.0.6-py3-none-any.whl |
|---|---|
| Size | 12.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
afd180bd52ee28be37e1ef878b6495a530bb6865fcd7b863dd8d5352751d00bc
|
|
BLAKE2b-256 checksum How to use checksums |
34179a414a02725991e8e8095483aa7665014c61a3f9395e37bb37bff07d1c22
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.2.0 CPython/3.13.0 Windows/11
|