3

如何使用 django-simple-history 存储 ManyToManyField 的历史记录。我使用了带有属性 m2m_filds 的 HistoricalRecords,但它抛出错误:意外的关键字参数'm2m_fields'

4

3 回答 3

6

我是 GitHub 上的 macro1,我猜是 django-simple-history 的事实上的维护者。

从您的问题来看,与其他领域相比,您似乎只是在询问一般的 ManyToManyField 支持。简短的回答是我们目前不支持它。

ManyToManyFields 实际上创建了一个中间模型,表示您正在使用的两个模型之间的关系。

如果您想跟踪该关系,我建议制作一个表示该关系的“通过”模型并将其传递给 ManyToManyField 构造函数。然后,您可以通过模型注册它以跟踪其历史记录。如果您在该设置中遇到“意外的关键字参数'm2m_fields'”之类的错误,请在我们的跟踪器中打开一个问题。

于 2016-02-12T05:14:03.910 回答
1

尽管 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)

于 2021-08-31T13:35:58.410 回答
0

正如django-simple-history的作者 所说,这不可能仅检测特定字段的变化,因为

如您所知,simple-history 根本不考虑保存的值。它在每个保存或删除信号上盲目地保存一个新的历史版本。

他还说Field Tracker可能会完成这项工作。

于 2016-02-10T11:20:29.340 回答