Skip to main content

winidjango

CI CD

CoverageTester ProjectTester

DependencyAuditor DependencyChecker MarkdownLinter PythonLinter SecretsChecker SecurityLinter SpellChecker TypeChecker VersionControlHookManager

PackageManager Pyrigger RemoteVersionController VersionController

DocsBuilder PackageIndex ProgrammingLanguage License


A utility package for django


Table of Contents

Features

🚀 High-Performance Bulk Operations

  • Multithreaded Processing: Parallel execution of database operations for maximum speed
  • Automatic Chunking: Configurable batch sizes (default: 1000) for memory-efficient processing
  • Transaction Safety: Atomic operations with intelligent transaction management
  • Dependency Resolution: Automatic topological sorting for foreign key relationships

🛠️ Database Utilities

  • Bulk Create/Update/Delete: Process thousands of records efficiently
  • Deletion Simulation: Preview cascade effects before executing destructive operations
  • Bulk Comparison: Detect differences between datasets with field-level hashing
  • Raw SQL Execution: Safe parameter binding with automatic cursor management

📦 Model Utilities

  • BaseModel: Abstract base with created_at, updated_at, and type-safe meta property
  • Topological Sorting: Automatic dependency ordering for model operations
  • Field Introspection: Type-safe utilities for working with model fields

🎯 Management Command Framework

  • ABCBaseCommand: Template method pattern with automatic logging
  • ImportDataBaseCommand: Structured data import with Polars integration
  • Built-in Arguments: Standard options for dry-run, batch size, threading, and more
  • Type Safety: Full type hints with abstract method enforcement

Installation

pip install winidjango

Or using uv:

uv add winidjango

Quick Start

Bulk Operations

from winidjango.core.db.bulk import bulk_create_in_steps

# Create 10,000 records in batches of 1000
authors = [Author(name=f"Author {i}") for i in range(10000)]
created = bulk_create_in_steps(Author, authors, step=1000)

Automatic Dependency Resolution

from winidjango.core.db.bulk import bulk_create_bulks_in_steps

# Create related models in correct order automatically
results = bulk_create_bulks_in_steps({
    Author: authors,
    Book: books,      # Created after Author
    Review: reviews,  # Created after Book
})

Deletion Simulation

from winidjango.core.db.bulk import simulate_bulk_deletion

# Preview what would be deleted
deletion_preview = simulate_bulk_deletion(Author, authors_to_delete)
print(f"Would delete {len(deletion_preview[Author])} authors")
print(f"Would cascade delete {len(deletion_preview[Book])} books")

Custom Management Command

from winidjango.core.commands.base.base import ABCBaseCommand
from argparse import ArgumentParser

class MyCommand(ABCBaseCommand):
    def add_command_arguments(self, parser: ArgumentParser) -> None:
        parser.add_argument('--input-file', type=str, required=True)

    def handle_command(self) -> None:
        input_file = self.get_option('input_file')
        dry_run = self.get_option('dry_run')  # Built-in

        if dry_run:
            self.stdout.write('Dry run mode')

        # Your logic here

Data Import Command

from winidjango.core.commands.import_data import ImportDataBaseCommand
import polars as pl

class ImportUsersCommand(ImportDataBaseCommand):
    def handle_import(self) -> pl.DataFrame:
        return pl.read_csv("users.csv")

    def get_cleaning_df_cls(self) -> type[CleaningDF]:
        return MyCleaningDF

    def get_bulks_by_model(
        self, df: pl.DataFrame
    ) -> dict[type[Model], Iterable[Model]]:
        users = [User(name=row["name"]) for row in df.iter_rows(named=True)]
        return {User: users}

Documentation

Comprehensive documentation is available in the docs/ directory:

Requirements

  • Python: 3.12+
  • Django: Compatible with modern Django versions
  • Dependencies:
    • django
    • django-stubs-ext
    • winiutils

Development

Setup

# Clone the repository
git clone https://github.com/Winipedia/winidjango.git
cd winidjango

# Install dependencies
uv sync

# Install pre-commit hooks
pre-commit install

Code Quality

This project uses:

  • mypy: Strict type checking
  • ruff: Linting and formatting
  • bandit: Security analysis
  • pytest: Testing framework
# Run type checking
mypy .

# Run linting
ruff check .

# Run security checks
bandit -r winidjango

# Format code
ruff format .

Testing

# Run all tests
pytest

# Run with coverage
pytest --cov=winidjango

# Run specific test file
pytest tests/test_winidjango/test_src/test_db/test_bulk.py

Contributing

Contributions are welcome! Please feel free to submit a Pull Request. For major changes, please open an issue first to discuss what you would like to change.

  1. Fork the repository
  2. Create your feature branch (git switch -c feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add some amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

License

This project is licensed under the MIT License, see the LICENSE file for details.

Acknowledgments

  • Built with pyrig - Python project scaffolding tool
  • Integrates with winiutils - General Python utilities

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

winidjango-4.1.2.tar.gz (18.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

winidjango-4.1.2-py3-none-any.whl (25.0 kB view details)

Uploaded Python 3

File details

Details for the file winidjango-4.1.2.tar.gz.

File metadata

  • Download URL: winidjango-4.1.2.tar.gz
  • Upload date:
  • Size: 18.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for winidjango-4.1.2.tar.gz
Algorithm Hash digest
SHA256 040acb571ef40f5877f39cb4f4163e9f405876f02930fd64b3e75c31dcb6e49e
MD5 9ac2f3b1880958bae38ac89f29cc154a
BLAKE2b-256 91824d1a5edf6aec89cf29e387024f89e6c6031caad3b78be6dbd1b3274f4955

See more details on using hashes here.

File details

Details for the file winidjango-4.1.2-py3-none-any.whl.

File metadata

  • Download URL: winidjango-4.1.2-py3-none-any.whl
  • Upload date:
  • Size: 25.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.28 {"installer":{"name":"uv","version":"0.11.28","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for winidjango-4.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 766f6f90df58c46bde770c786a63c2db847269a3f7898ada910a2b775b4b03db
MD5 54a1671d86ada6f2799b5102493235a2
BLAKE2b-256 8e2c22a5a3baffb7c26d52ac609ed5a4f2372eb7f91a0541fd17793fec7f447a

See more details on using hashes here.

Release history Release notifications | RSS feed

4.15.3

2 files

4.15.1

2 files

4.15.0

2 files

4.14.42

2 files

4.14.41

2 files

4.14.40

2 files

4.14.39

2 files

4.14.38

2 files

4.14.36

2 files

4.14.35

2 files

4.14.34

2 files

4.14.32

2 files

4.14.30

2 files

4.14.27

2 files

4.14.26

2 files

4.14.25

2 files

4.14.23

2 files

4.14.20

2 files

4.14.19

2 files

4.14.18

2 files

4.14.17

2 files

4.14.16

2 files

4.14.15

2 files

4.14.13

2 files

4.14.12

2 files

4.14.11

2 files

4.14.10

2 files

4.14.8

2 files

4.14.7

2 files

4.14.6

2 files

4.14.5

2 files

4.14.4

2 files

4.14.2

2 files

4.14.1

2 files

4.14.0

2 files

4.13.0

2 files

4.12.0

2 files

4.11.0

2 files

4.2.0

2 files

4.1.6

2 files

4.1.3

2 files

This release

4.1.2 This release

2 files

4.1.0

2 files

4.0.16

2 files

4.0.15

2 files

4.0.14

2 files

4.0.13

2 files

4.0.12

2 files

4.0.11

2 files

4.0.10

2 files

4.0.9

2 files

4.0.8

2 files

4.0.7

2 files

4.0.6

2 files

4.0.5

2 files

4.0.1

2 files

4.0.0

2 files

3.1.6

2 files

3.1.2

2 files

3.1.1

2 files

3.1.0

2 files

3.0.0

2 files

2.21.0

2 files

2.20.0

2 files

2.19.0

2 files

2.18.0

2 files

2.17.0

2 files

2.12.0

2 files

2.11.0

2 files

2.8.0

2 files

2.7.1

2 files

2.7.0

2 files

2.6.1

2 files

2.6.0

2 files

2.5.3

2 files

2.5.2

2 files

2.5.1

2 files

2.5.0

2 files

2.4.4

2 files

2.4.3

2 files

2.4.2

2 files

2.4.1

2 files

2.4.0

2 files

2.3.0

2 files

2.1.9

2 files

2.1.8

2 files

2.1.7

2 files

2.1.6

2 files

2.1.4

2 files

2.1.3

2 files

2.1.2

2 files

2.1.1

2 files

2.1.0

2 files

2.0.103

2 files

2.0.102

2 files

2.0.101

2 files

2.0.100

2 files

2.0.99

2 files

2.0.98

2 files

2.0.97

2 files

2.0.96

2 files

2.0.95

2 files

2.0.94

2 files

2.0.93

2 files

2.0.92

2 files

2.0.91

2 files

2.0.90

2 files

2.0.89

2 files

2.0.88

2 files

2.0.87

2 files

2.0.86

2 files

2.0.85

2 files

2.0.84

2 files

2.0.83

2 files

2.0.82

2 files

2.0.81

2 files

2.0.80

2 files

2.0.79

2 files

2.0.78

2 files

2.0.77

2 files

2.0.76

2 files

2.0.75

2 files

2.0.74

2 files

2.0.73

2 files

2.0.72

2 files

2.0.71

2 files

2.0.70

2 files

2.0.69

2 files

2.0.68

2 files

2.0.67

2 files

2.0.66

2 files

2.0.65

2 files

2.0.64

2 files

2.0.63

2 files

2.0.62

2 files

2.0.61

2 files

2.0.60

2 files

2.0.59

2 files

2.0.58

2 files

2.0.57

2 files

2.0.56

2 files

2.0.55

2 files

2.0.54

2 files

2.0.53

2 files

2.0.52

2 files

2.0.51

2 files

2.0.50

2 files

2.0.49

2 files

2.0.48

2 files

2.0.47

2 files

2.0.46

2 files

2.0.45

2 files

2.0.44

2 files

2.0.43

2 files

2.0.42

2 files

2.0.41

2 files

2.0.40

2 files

2.0.39

2 files

2.0.38

2 files

2.0.37

2 files

2.0.36

2 files

2.0.35

2 files

2.0.34

2 files

2.0.33

2 files

2.0.32

2 files

2.0.31

2 files

2.0.30

2 files

2.0.29

2 files

2.0.28

2 files

2.0.27

2 files

2.0.26

2 files

2.0.25

2 files

2.0.24

2 files

2.0.23

2 files

2.0.22

2 files

2.0.21

2 files

2.0.20

2 files

2.0.19

2 files

2.0.18

2 files

2.0.17

2 files

2.0.16

2 files

2.0.15

2 files

2.0.14

2 files

2.0.13

2 files

2.0.12

2 files

2.0.11

2 files

2.0.10

2 files

2.0.9

2 files

2.0.8

2 files

2.0.7

2 files

2.0.6

2 files

2.0.5

2 files

2.0.4

2 files

2.0.3

2 files

2.0.2

2 files

2.0.1

2 files

1.0.11

2 files

1.0.10

2 files

1.0.9

2 files

1.0.8

2 files

1.0.7

2 files

1.0.6

2 files

1.0.5

2 files

1.0.4

2 files

1.0.3

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page