Skip to main content

Model Observer is a Django package that provides functionality to track events of the model. Based on django signals.

Project description

Model Observer

Model Observer is a Django package that provides functionality to track events of the model. Based on django signals.

ModelObserver class will observe model behavior and triggers different signals.

Installation

Use the package manager pip to install model_observer.

pip install model_observer

Available signals

class ModelObserver:
    _available_signal_types = ('pre_init', 'post_init', 'pre_save', 'post_save',
                               'pre_delete', 'post_delete', 'm2m_changed',
                               'pre_migrate', 'post_migrate')

Usage

from model_observer.model import ModelObserver

class Blog(Model, ModelObserver):
    title = models.CharField(max_length=50)

    def on_delete(self, **kwargs):
        print('Object was deleted!')
        print('self', self.__dict__)
        print('kwargs', kwargs)

    def on_create(self, **kwargs):
        print('Object was created!')
        print('self', self.__dict__)
        print('kwargs', kwargs)

    def on_update(self, **kwargs):
        print('Object was updated!')
        print('self', self.__dict__)
        print('kwargs', kwargs)

Create object

from blogs.models import Blog
blog = Blog.objects.create(title='test1')

Output

Object was created!
self {'_state': <django.db.models.base.ModelState object at 0x0000013FDE855640>, 'id': 2, 'title': 'test1'}
kwargs {'signal': <django.db.models.signals.ModelSignal object at 0x0000013FDD6A93A0>, 'sender': <class 'blogs.models.Blog'>, 'instance': <Blog: Blog object (2)>, 'created': True, 'update_fields': None, 'raw': False, 'using': 'default'}

Update object

from blogs.models import Blog
blog = Blog.objects.get(pk=1)
blog.title = 'test 1!'
blog.save()

Output

Object was updated!
self {'_state': <django.db.models.base.ModelState object at 0x0000024B609A8FA0>, 'id': 1, 'title': 'test 1!', '_pre_save_instance': <Blog: Blog object (1)>, '_pre_delete_instance': <Blog: Blog object (1)>}
kwargs {'signal': <django.db.models.signals.ModelSignal object at 0x0000024B5F69FCD0>, 'sender': <class 'blogs.models.Blog'>, 'instance': <Blog: Blog object (1)>, 'created': False, 'update_fields': None, 'raw': False, 'using': 'default'}

Delete object

from blogs.models import Blog
blog = Blog.objects.get(pk=3)
blog.delete()

Output

Object was deleted!
self {'_state': <django.db.models.base.ModelState object at 0x00000182BA476AC0>, 'id': 3, 'title': 'test1'}
kwargs {'signal': <django.db.models.signals.ModelSignal object at 0x00000182B92985E0>, 'sender': <class 'blogs.models.Blog'>, 'instance': <Blog: Blog object (3)>, 'using': 'default'}
(1, {'blogs.Blog': 1})

Observe the object field

Integration

class Blog(models.Model, ModelObserver):
    ...

    def title_changed(self, **kwargs):
        print('Field `title` was changed!')
        print('self', self.__dict__)
        print('kwargs', kwargs)

        instance = kwargs.get('instance')  # Work with instance
        ...
from blogs.models import Blog
blog = Blog.objects.first()
blog.title = 'Test 2!'
blog.save()

Output

Field `title` was changed!
self {'_state': <django.db.models.base.ModelState object at 0x0000023ED4BF4700>, 'id': 4, 'title': 'Test 2!', '_pre_save_instance': <Blog: Blog object (4)>, '_pre_delete_instance': <Blog: Blog object (4)>}
kwargs {'signal': <django.db.models.signals.ModelSignal object at 0x0000023ED3A48280>, 'sender': <class 'blogs.models.Blog'>, 'instance': <Blog: Blog object (4)>, 'raw': False, 'using': 'default', 'update_fields': None}

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

License

MIT

Project details


Download files

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

Source Distribution

model-observer-0.0.22.tar.gz (4.8 kB view details)

Uploaded Source

Built Distribution

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

model_observer-0.0.22-py3-none-any.whl (4.8 kB view details)

Uploaded Python 3

File details

Details for the file model-observer-0.0.22.tar.gz.

File metadata

  • Download URL: model-observer-0.0.22.tar.gz
  • Upload date:
  • Size: 4.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.4

File hashes

Hashes for model-observer-0.0.22.tar.gz
Algorithm Hash digest
SHA256 1ca4ce1b046b2d28a0d9e65eeaa3a0fccf93aa88b9430a01aabd0798454c2f12
MD5 1696cec9e3255ade8f091cbecc2f0830
BLAKE2b-256 345d9b2b8456d9307a23b7495851a40bae4ee63753ec4db95207a53a670f3d9c

See more details on using hashes here.

File details

Details for the file model_observer-0.0.22-py3-none-any.whl.

File metadata

  • Download URL: model_observer-0.0.22-py3-none-any.whl
  • Upload date:
  • Size: 4.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.4.1 importlib_metadata/4.0.1 pkginfo/1.7.0 requests/2.25.1 requests-toolbelt/0.9.1 tqdm/4.60.0 CPython/3.9.4

File hashes

Hashes for model_observer-0.0.22-py3-none-any.whl
Algorithm Hash digest
SHA256 c636ca7626770f16c73c2782b68b763cce6c3a097849d749b33d5deae1f5214b
MD5 83c93ae4791b87e0275ca3f7b91b9b91
BLAKE2b-256 7034da8ae52d0c004cfb5c837096149b6b85af1d9e44103fdd4e49485fd7a4ad

See more details on using hashes here.

Supported by

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