如何使用django-simple-history存储ManyToManyField的历史,

9rygscc1  于 2023-10-21  发布在  Go
关注(0)|答案(4)|浏览(104)

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

p5cysglq

p5cysglq1#

我是GitHub上的macro 1,我猜是django-simple-history的实际维护者。
从你的问题来看,你似乎只是在询问与其他字段相比,对ManyToManyField的一般支持。简短的回答是,我们目前不支持它。
ManyToManyFields实际上创建了一个中间模型,它表示您正在使用的两个模型之间的关系。
如果你想跟踪这种关系,我建议你做一个“通过”模型来表示这种关系,并将其传递给ManyToManyField构造函数。然后,您可以通过模型注册它以跟踪其历史。如果您在该设置中遇到类似“意外关键字参数'm2m_fields'”的错误,请在我们的跟踪程序中打开一个问题。

oiopk7p5

oiopk7p52#

尽管django-simple-history不允许多对多关系的历史表,但实际上有一种方法可以实现这一点。
你可以做的是手动创建多对多表,而不是使用djangos add和remove,你只需创建和删除关系。如果你用一个例子来看它,我们会有:

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)你将在历史表和相同的多对多表中跟踪所有内容。

bkhjykvo

bkhjykvo3#

作为django-simple-historysays的作者,这是不可能只检测到特定字段的更改的,因为
正如你已经知道的,simple-history根本不查看保存的值。它盲目地在每次保存或删除信号时保存一个新的历史版本。
他还说,这可能是可能的外地跟踪做这项工作。

4uqofj5v

4uqofj5v4#

使用django-simple-history==3.3.0,你现在可以包含多对多的字段,如下所示:

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])

相关问题