Skip to content

Commit 6974028

Browse files
committed
add docs to explain the usage of m2m tracking
1 parent f9d5d1e commit 6974028

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

docs/historical_model.rst

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -447,3 +447,42 @@ And you don't want to create database index for ``question``, it is necessary to
447447
448448
By default, django-simple-history keeps all indices. and even forces them on unique fields and relations.
449449
WARNING: This will drop performance on historical lookups
450+
451+
Tracking many to many relationships
452+
-----------------------------------
453+
By default, many to many fields are ignored when tracking changes.
454+
If you want to track many to many relationships, you need to define them explicitly:
455+
456+
.. code-block:: python
457+
458+
class Category(models.Model):
459+
pass
460+
461+
class Poll(models.Model):
462+
question = models.CharField(max_length=200)
463+
categories = models.ManyToManyField(Category)
464+
history = HistoricalRecords(many_to_many=[categories])
465+
466+
This will create a historical intermediate model that tracks each relational change
467+
between `Poll` and `Category`.
468+
469+
You will see the many to many changes when diffing between two historical records:
470+
471+
.. code-block:: python
472+
473+
informal = Category(name="informal questions")
474+
official = Category(name="official questions")
475+
p = Poll.objects.create(question="what's up?")
476+
p.save()
477+
p.categories.add(informal, official)
478+
p.categories.remove(informal)
479+
480+
last_record = p.history.latest()
481+
previous_record = last_record.prev_record()
482+
delta = last_record.diff_against(previous_record)
483+
484+
for change in delta.changes:
485+
print("{} changed from {} to {}")
486+
487+
# Output:
488+
# categories changed from [{'poll': 1, 'category': 1}, { 'poll': 1, 'category': 2}] to [{'poll': 1, 'category': 2}]

0 commit comments

Comments
 (0)