Skip to main content

Django Gem

Django-gem is a reusable Django package that allows user to offload on-the-fly calculations for Django models by putting them into database and providing and easy to use architecture to define, how and when those database fields need to be refreshed.

Installation


Using pip

pip install django-gem

Using poetry

poetry add django-gem

Then add 'django_gem' to your INSTALLED_APPS.

INSTALLED_APPS = [
    ...
    'django_gem',
]

Usage

First you will need to create a class that knows how to re-calculate your database fields. In this package those classes are called "Cutters".

Each of the methods on the cutter need to be defined as property, and the names of those methods should mirror re-calculated fields on the Gem model in the format of cut_<field_name>.

Side effects on the properties define what related models should trigger recalculations on those fields.

from django_gems_example.gems.callbacks.author import AuthorCutterCallbacks
from django_gems_example.models import Author, Book

from django_gem.cutters.base import BaseCutter
from django_gem.decorators.cutters import side_effects


class AuthorCutter(BaseCutter):
    instance: Author

    @property
    @side_effects(
        (Author, [], AuthorCutterCallbacks.author),
        (Book, ["author"], AuthorCutterCallbacks.book_author),
    )
    def cut_book_count(self):
        return self.instance.books.count()

Django-gem allows you to create a "satellite" model for you main one, and define the CutterEngineMeta with the created cutter.

from django.db import models
from django_gems_example.gems.cutters.author import AuthorCutter
from django_gems_example.models import Author

from django_gem.models.base import CutterEngineBaseModel, CutterEngineMetaBase


class AuthorGem(CutterEngineBaseModel):
    book_count = models.IntegerField(default=0)

    class CutterEngineMeta(CutterEngineMetaBase):
        model = Author
        cutter = AuthorCutter

To access these fields from the main model, you need to define a property on the model with the same name as the Gem field name, and wrap it with a gem_property decorator.

from django.db import models

from django_gem.decorators import gem_property


class Author(models.Model):
    name = models.CharField(max_length=100)

    @gem_property
    def book_count(self):
        return self.gem.book_count

All the calculations happen implicitly, as cutter_registry that is populated on Django app startup loads all the related models and attaches hooks for calculation. But, if needed, there are methods that you can invoke directly from the Saw class. It allows refreshing a model, a queryset or an entire content type.

Metadata

Release files for django-gem 1.5.4

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-gem 1.5.4
File Size Uploaded
django_gem-1.5.4.tar.gz 21.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for django-gem 1.5.4
File Interpreter ABI Platform
django_gem-1.5.4-py3-none-any.whl Python 3 none any Details

Total release size: 60.6 kB

Release files / django_gem-1.5.4.tar.gz

Download URL django_gem-1.5.4.tar.gz
Size 21.8 kB
Tags Source
SHA-256 checksum
How to use checksums
866b02eb5bdbf510b670a56bdfb3b12240636d2cc87316ab24df2bcb9c611676
BLAKE2b-256 checksum
How to use checksums
bd2644a37cf1b574e3b51b5a022ad6c68dcd289714a0412243299d08ffc2c4ff
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.11.0 Linux/6.5.0-1025-azure

Release files / django_gem-1.5.4-py3-none-any.whl

Download URL django_gem-1.5.4-py3-none-any.whl
Size 38.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9160b1bb22e2b69bdb83310287b0f83a92d2bd2f86aba291b4cc26bf7e1ba9e7
BLAKE2b-256 checksum
How to use checksums
e8673fa4f0dbad055e7b22f3df6b0efe9c1e2010fbaec6f9a304a923a8f9121b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.8.3 CPython/3.11.0 Linux/6.5.0-1025-azure

Release history Release notifications | RSS feed

This release

1.5.4 This release

2 release files

1.5.3

2 release files

1.5.2

2 release files

1.5.1

2 release files

1.5.0

2 release files

1.4.1

2 release files

1.4.0

2 release files

1.3.0

2 release files

1.2.0

2 release files

1.1.6

2 release files

1.1.5

2 release files

1.1.4

2 release files

1.1.3

2 release files

1.1.2

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page