如何使用 django-simple-history 存储 ManyToManyField 的历史记录。我使用了带有属性 m2m_filds 的 HistoricalRecords,但它抛出错误:意外的关键字参数'm2m_fields'
3 回答
我是 GitHub 上的 macro1,我猜是 django-simple-history 的事实上的维护者。
从您的问题来看,与其他领域相比,您似乎只是在询问一般的 ManyToManyField 支持。简短的回答是我们目前不支持它。
ManyToManyFields 实际上创建了一个中间模型,表示您正在使用的两个模型之间的关系。
如果您想跟踪该关系,我建议制作一个表示该关系的“通过”模型并将其传递给 ManyToManyField 构造函数。然后,您可以通过模型注册它以跟踪其历史记录。如果您在该设置中遇到“意外的关键字参数'm2m_fields'”之类的错误,请在我们的跟踪器中打开一个问题。
尽管 django-simple-history 不允许为多对多关系创建历史表,但实际上有一种方法可以实现这一点。
您可以做的是手动创建多对多表,而不是使用 djangos 添加和删除,您只需创建和删除关系。如果你看一个例子,我们会有:
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()
如果您现在使用:
StudentClasses.objects.create(student=student, class=class)
而不是你将在历史表student.classes.add(class)
和相同的多对多表中跟踪所有内容。delete()
student.classes.remove(class)
正如django-simple-history的作者 所说,这不可能仅检测特定字段的变化,因为
如您所知,simple-history 根本不考虑保存的值。它在每个保存或删除信号上盲目地保存一个新的历史版本。
他还说Field Tracker可能会完成这项工作。