Skip to main content

Django ManyToMany relation field with history of changes

Project description

Django ManyToMany History
========================

[![PyPI version](https://badge.fury.io/py/django-m2m-history.png)](http://badge.fury.io/py/django-m2m-history) [![Build Status](https://travis-ci.org/ramusus/django-m2m-history.png?branch=master)](https://travis-ci.org/ramusus/django-m2m-history) [![Coverage Status](https://coveralls.io/repos/ramusus/django-m2m-history/badge.png?branch=master)](https://coveralls.io/r/ramusus/django-m2m-history)

Django ManyToMany relation field with history of changes. Like usual Django's ManyToManyField, it's generate intermediary join table
to represent the many-to-many relationship, but with two additional columns: 'time_from' and 'time_to'. Using updated interface of field it's
possible to retreive history of all versions of this field's value.

Compatibility
-------------

* python v2.7, v3.4
* django >=1.4, <=1.7
* postgres, mysql

Installation
------------

pip install django-m2m-history

Add into `settings.py` lines:

INSTALLED_APPS = (
...
'm2m_history',
)

Usage example
-------------

Make 2 models with many-to-many relationship:

class Publication(models.Model):
title = models.CharField(max_length=30)

def __str__(self):
return self.title

class Article(models.Model):
headline = models.CharField(max_length=100)
publications = ManyToManyHistoryField(Publication)

def __str__(self):
return self.headline

Create objects and relations betweeen them:

>>> p1 = Publication.objects.create(title='Pub1')
>>> p2 = Publication.objects.create(title='Pub2')
>>> p3 = Publication.objects.create(title='Pub3')

>>> article = Article.objects.create(headline='Article1')
>>> state_time1 = datetime.now()

>>> article.publications = [p1, p2]
>>> state_time2 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub1>, <Publication: Pub2>]
>>> article.publications.count()
2
>>> article.publications.through.objects.count()
2

>>> article.publications = [p3]
>>> state_time3 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub3>]
>>> article.publications.count()
1
>>> article.publications.through.objects.count()
3

>>> article.publications.add(p2, p1)
>>> state_time4 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub1>, <Publication: Pub2>, <Publication: Pub3>]
>>> article.publications.count()
3
>>> article.publications.through.objects.count()
5

>>> article.publications.remove(p2, p1)
>>> state_time5 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub3>]
>>> article.publications.count()
1
>>> article.publications.through.objects.count()
5

>>> article.publications = [p1, p2]
>>> state_time6 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub1>, <Publication: Pub2>]
>>> article.publications.count()
2
>>> article.publications.through.objects.count()
7

>>> article.publications.clear()
>>> state_time7 = article.publications.last_update_time()
>>> article.publications.all()
[]
>>> article.publications.count()
0
>>> article.publications.through.objects.count()
7

Get objects of history states by timestamps:

>>> article.publications.were_at(state_time1)
[]

>>> article.publications.were_at(state_time2)
[<Publication: Pub1>, <Publication: Pub2>]

>>> article.publications.were_at(state_time3)
[<Publication: Pub3>]

>>> article.publications.were_at(state_time4)
[<Publication: Pub1>, <Publication: Pub2>, <Publication: Pub3>]

>>> article.publications.were_at(state_time5)
[<Publication: Pub3>]

>>> article.publications.were_at(state_time6)
[<Publication: Pub1>, <Publication: Pub2>]

>>> article.publications.were_at(state_time7)
[]

Get added and removed objects of history states by timestamps:

>>> article.publications.added_at(state_time3)
[<Publication: Pub3>]

>>> article.publications.removed_at(state_time3)
[<Publication: Pub1>, <Publication: Pub2>]

>>> article.publications.added_at(state_time4)
[<Publication: Pub1>, <Publication: Pub2>]

>>> article.publications.removed_at(state_time5)
[<Publication: Pub1>, <Publication: Pub2>]

>>> article.publications.added_at(state_time6)
[<Publication: Pub1>, <Publication: Pub2>]

>>> article.publications.removed_at(state_time6)
[<Publication: Pub3>]

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

django-m2m-history-0.3.3.tar.gz (24.7 kB view details)

Uploaded Source

File details

Details for the file django-m2m-history-0.3.3.tar.gz.

File metadata

File hashes

Hashes for django-m2m-history-0.3.3.tar.gz
Algorithm Hash digest
SHA256 1e9665bce435080ef1021e96eb92b289355fa36783893c4ebb9f24bf04ca3160
MD5 938674583dbb3786c37b8aac420b9906
BLAKE2b-256 0285b8ae2e7c796d5c24d6ca3e8c75e6340fca42483b205a67dbac924a5fbd52

See more details on using hashes here.

Supported by

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