class Class(models.Model):
name = models.CharField(max_length=255)
surname = models.CharField(max_length=255)
history = HistoricalRecords()
class Student(models.Model):
name = models.CharField(max_length=255)
surname = models.CharField(max_length=255)
classes = models.ManyToManyField(Class)
history = HistoricalRecords()
您可以手动创建多对多表:
class Class(models.Model):
name = models.CharField(max_length=255)
surname = models.CharField(max_length=255)
history = HistoricalRecords()
class Student(models.Model):
name = models.CharField(max_length=255)
surname = models.CharField(max_length=255)
history = HistoricalRecords()
class StudentClasses(models.Model):
student = models.ForeignKey(Student)
class = models.ForeignKey(Class)
history = HistoricalRecords()
class Class(models.Model):
name = models.CharField(max_length=255)
surname = models.CharField(max_length=255)
history = HistoricalRecords()
class Student(models.Model):
name = models.CharField(max_length=255)
surname = models.CharField(max_length=255)
classes = models.ManyToManyField(Class)
history = HistoricalRecords(m2m_fields=[classes])
4条答案
按热度按时间p5cysglq1#
我是GitHub上的macro 1,我猜是django-simple-history的实际维护者。
从你的问题来看,你似乎只是在询问与其他字段相比,对ManyToManyField的一般支持。简短的回答是,我们目前不支持它。
ManyToManyFields实际上创建了一个中间模型,它表示您正在使用的两个模型之间的关系。
如果你想跟踪这种关系,我建议你做一个“通过”模型来表示这种关系,并将其传递给ManyToManyField构造函数。然后,您可以通过模型注册它以跟踪其历史。如果您在该设置中遇到类似“意外关键字参数'm2m_fields'”的错误,请在我们的跟踪程序中打开一个问题。
oiopk7p52#
尽管django-simple-history不允许多对多关系的历史表,但实际上有一种方法可以实现这一点。
你可以做的是手动创建多对多表,而不是使用djangos add和remove,你只需创建和删除关系。如果你用一个例子来看它,我们会有:
您可以手动创建多对多表:
如果您现在用途:
StudentClasses.objects.create(student=student, class=class)
而不是student.classes.add(class)
和delete()
而不是student.classes.remove(class)
你将在历史表和相同的多对多表中跟踪所有内容。bkhjykvo3#
作为django-simple-historysays的作者,这是不可能只检测到特定字段的更改的,因为
正如你已经知道的,simple-history根本不查看保存的值。它盲目地在每次保存或删除信号时保存一个新的历史版本。
他还说,这可能是可能的外地跟踪做这项工作。
4uqofj5v4#
使用django-simple-history==3.3.0,你现在可以包含多对多的字段,如下所示: