【问题标题】:How can I store history of ManyToManyField using django-simple-history.如何使用 django-simple-history 存储 ManyToManyField 的历史记录。
【发布时间】:2016-05-20 15:15:11
【问题描述】:

如何使用 django-simple-history 存储 ManyToManyField 的历史记录。我使用了带有属性 m2m_filds 的 HistoricalRecords,但它抛出错误:unexpected keyword argument 'm2m_fields'

【问题讨论】:

  • 参数 m2m_fields 是 django-simple-history 的一个分支的一部分,而不是 django-simple-history 本身的一部分。

标签: python django history manytomanyfield django-simple-history


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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 感谢您的回复!您能否在 django-simple-history 的文档中详细说明?谢谢!
    • 我相信 m2m_fields 只是 django-simple-history 分支中的一个选项
    【解决方案3】:

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

    正如您已经知道的那样,简单历史不会查看当前的值 完全保存。它在每次保存时盲目地保存一个新的历史版本 或删除信号。

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

    【讨论】:

      猜你喜欢
      • 2014-08-04
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多