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.
## 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.through.objects.count() == 2
True
>>> article.publications = [p3]
>>> state_time3 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub3>]
>>> article.publications.through.objects.count() == 3
True
>>> article.publications.add(p2, p1)
>>> state_time4 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub1>, <Publication: Pub2>, <Publication: Pub3>]
>>> article.publications.through.objects.count() == 5
True
>>> article.publications.remove(p2, p1)
>>> state_time5 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub3>]
>>> article.publications.through.objects.count() == 5
True
>>> article.publications = [p1, p2]
>>> state_time6 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub1>, <Publication: Pub2>]
>>> article.publications.through.objects.count() == 7
True
>>> article.publications.clear()
>>> state_time7 = article.publications.last_update_time()
>>> article.publications.all()
[]
>>> article.publications.through.objects.count() == 7
True
Get objects of history states by timestamps:
>>> article.publications.all(state_time1)
[]
>>> article.publications.all(state_time2)
[<Publication: Pub1>, <Publication: Pub2>]
>>> article.publications.all(state_time3)
[<Publication: Pub3>]
>>> article.publications.all(state_time4)
[<Publication: Pub1>, <Publication: Pub2>, <Publication: Pub3>]
>>> article.publications.all(state_time5)
[<Publication: Pub3>]
>>> article.publications.all(state_time6)
[<Publication: Pub1>, <Publication: Pub2>]
>>> article.publications.all(state_time7)
[]
Get added and removed objects of history states by timestamps:
>>> article.publications.added_at(state_time2)
[<Publication: Pub1>, <Publication: Pub2>]
>>> article.publications.removed_at(state_time2)
[]
>>> 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_time4)
[]
>>> article.publications.added_at(state_time5)
[]
>>> 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>]
>>> article.publications.added_at(state_time7)
[]
>>> article.publications.removed_at(state_time7)
[<Publication: Pub1>, <Publication: Pub2>]
[![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.
## 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.through.objects.count() == 2
True
>>> article.publications = [p3]
>>> state_time3 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub3>]
>>> article.publications.through.objects.count() == 3
True
>>> article.publications.add(p2, p1)
>>> state_time4 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub1>, <Publication: Pub2>, <Publication: Pub3>]
>>> article.publications.through.objects.count() == 5
True
>>> article.publications.remove(p2, p1)
>>> state_time5 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub3>]
>>> article.publications.through.objects.count() == 5
True
>>> article.publications = [p1, p2]
>>> state_time6 = article.publications.last_update_time()
>>> article.publications.all()
[<Publication: Pub1>, <Publication: Pub2>]
>>> article.publications.through.objects.count() == 7
True
>>> article.publications.clear()
>>> state_time7 = article.publications.last_update_time()
>>> article.publications.all()
[]
>>> article.publications.through.objects.count() == 7
True
Get objects of history states by timestamps:
>>> article.publications.all(state_time1)
[]
>>> article.publications.all(state_time2)
[<Publication: Pub1>, <Publication: Pub2>]
>>> article.publications.all(state_time3)
[<Publication: Pub3>]
>>> article.publications.all(state_time4)
[<Publication: Pub1>, <Publication: Pub2>, <Publication: Pub3>]
>>> article.publications.all(state_time5)
[<Publication: Pub3>]
>>> article.publications.all(state_time6)
[<Publication: Pub1>, <Publication: Pub2>]
>>> article.publications.all(state_time7)
[]
Get added and removed objects of history states by timestamps:
>>> article.publications.added_at(state_time2)
[<Publication: Pub1>, <Publication: Pub2>]
>>> article.publications.removed_at(state_time2)
[]
>>> 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_time4)
[]
>>> article.publications.added_at(state_time5)
[]
>>> 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>]
>>> article.publications.added_at(state_time7)
[]
>>> article.publications.removed_at(state_time7)
[<Publication: Pub1>, <Publication: Pub2>]
Project details
Release history Release notifications | RSS feed
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.0.1.tar.gz
(15.4 kB
view details)
File details
Details for the file django-m2m-history-0.0.1.tar.gz
.
File metadata
- Download URL: django-m2m-history-0.0.1.tar.gz
- Upload date:
- Size: 15.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b1cf22563c6d478d7c115893e5a08de47fb117d3cbd44f9dac42af0150f5ce70 |
|
MD5 | 80571dd03ef6943a41df2377adc2864f |
|
BLAKE2b-256 | b0a9cf41a7aa94f60c0e89b1edce644df6942a5eb6f97b089c83875e9d1b6bb9 |