Django ManyToMany关系字段变更历史
项目描述
Django ManyToMany历史
========================
[](http://badge.fury.io/py/django-m2m-history) [](https://travis-ci.org/ramusus/django-m2m-history) [](https://coveralls.io/r/ramusus/django-m2m-history)
Django ManyToMany关系字段变更历史。与通常的Django的ManyToManyField一样,它生成中间连接表
来表示多对多关系,但有两个额外的列:'time_from'和'time_to'。使用字段的更新接口,可以检索此字段值的所有版本的
历史。
兼容性
-------------
* python v2.7, v3.4
* django >=1.5, <=1.8. **与Django 1.9不兼容**
* postgres
安装
------------
pip install django-m2m-history
将以下行添加到`settings.py`中
INSTALLED_APPS = (
...
'm2m_history',
)
用法示例
-------------
创建2个具有多对多关系的模型
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
创建对象并在它们之间建立关系
>>> 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()
[[出版物: 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()
[[出版物: Pub1], [出版物: Pub2], [出版物: 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()
[[出版物: 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
通过时间戳获取历史状态对象
>> article.publications.were_at(state_time1)
[]
>> article.publications.were_at(state_time2)
[<Publication: Pub1>, <Publication: Pub2>]
>> article.publications.were_at(state_time3)
[[出版物: Pub3]]
>> article.publications.were_at(state_time4)
[[出版物: Pub1], [出版物: Pub2], [出版物: Pub3]]
>> article.publications.were_at(state_time5)
[[出版物: Pub3]]
>> article.publications.were_at(state_time6)
[<Publication: Pub1>, <Publication: Pub2>]
>> article.publications.were_at(state_time7)
[]
通过时间戳获取历史状态中添加和删除的对象
>> article.publications.added_at(state_time3)
[[出版物: 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)
[[出版物: Pub3]]
========================
[](http://badge.fury.io/py/django-m2m-history) [](https://travis-ci.org/ramusus/django-m2m-history) [](https://coveralls.io/r/ramusus/django-m2m-history)
Django ManyToMany关系字段变更历史。与通常的Django的ManyToManyField一样,它生成中间连接表
来表示多对多关系,但有两个额外的列:'time_from'和'time_to'。使用字段的更新接口,可以检索此字段值的所有版本的
历史。
兼容性
-------------
* python v2.7, v3.4
* django >=1.5, <=1.8. **与Django 1.9不兼容**
* postgres
安装
------------
pip install django-m2m-history
将以下行添加到`settings.py`中
INSTALLED_APPS = (
...
'm2m_history',
)
用法示例
-------------
创建2个具有多对多关系的模型
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
创建对象并在它们之间建立关系
>>> 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()
[[出版物: 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()
[[出版物: Pub1], [出版物: Pub2], [出版物: 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()
[[出版物: 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
通过时间戳获取历史状态对象
>> article.publications.were_at(state_time1)
[]
>> article.publications.were_at(state_time2)
[<Publication: Pub1>, <Publication: Pub2>]
>> article.publications.were_at(state_time3)
[[出版物: Pub3]]
>> article.publications.were_at(state_time4)
[[出版物: Pub1], [出版物: Pub2], [出版物: Pub3]]
>> article.publications.were_at(state_time5)
[[出版物: Pub3]]
>> article.publications.were_at(state_time6)
[<Publication: Pub1>, <Publication: Pub2>]
>> article.publications.were_at(state_time7)
[]
通过时间戳获取历史状态中添加和删除的对象
>> article.publications.added_at(state_time3)
[[出版物: 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)
[[出版物: Pub3]]
项目详情
关闭
django-m2m-history-0.3.6.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | a4d04f244e284f191d0d1b75acf58afa9c6754cac94e5a8f94678edc8e1a91d9 |
|
MD5 | 21c422ba5e7dbdbff81af0a832345379 |
|
BLAKE2b-256 | 27469b3232433648020dff3d5def31446c095b86e20c7239ed2d4bcf29df689b |