【问题标题】:History of a ManyToManyField in django-simple-historydjango-simple-history 中的 ManyToManyField 的历史
【发布时间】:2014-08-04 06:27:28
【问题描述】:

简而言之,我需要将我的一个模型的多对多字段所做的更改保存在历史记录中。

我可以看到:https://github.com/Kyruus/django-simple-history/commit/5ba8d2b4d72819f154a11f297796e6a2bb7172bf 支持 M2M。但是,每当我对 M2M 字段进行更改时,它也会在所有历史记录中发生更改,就好像从未更改过一样。我是 django 和 python 的新手,所以也许我遗漏了一些东西。

我的models.py:

from django.db import models
from simple_history.models import HistoricalRecords

class Student(models.Model):
  studentname = models.CharField(max_length=50, verbose_name='Name')

class ClassRoom(models.Model):
  classname = models.CharField(max_length=50, verbose_name='Name')
  students = models.ManyToManyField(Student)
  history = HistoricalRecords()

我的 admin.py:

from django.contrib import admin
from school.models import Student, ClassRoom
from simple_history.admin import SimpleHistoryAdmin

class StudentAdmin(SimpleHistoryAdmin):
  list_display = ('studentname',)

class ClassRoomAdmin(SimpleHistoryAdmin):
  list_display = ('classname',)

admin.site.register(Student,StudentAdmin)
admin.site.register(ClassRoom, ClassRoomAdmin)

我通过以下方式安装了 django-simple-history:

>pip install django-simple-history

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    由于m2m_fields 实际上在标准分支中不可用,这里有一个使用 django-simple-history 包的替代解决方案。

    您可以手动创建多对多表,而不是使用 djangos 添加和删除,您只需创建和删除关系。如果你看一个例子,我们会有:

    class Student(models.Model):
      studentname = models.CharField(max_length=50, verbose_name='Name')
    
    class ClassRoom(models.Model):
      classname = models.CharField(max_length=50, verbose_name='Name')
      history = HistoricalRecords()
    
    class StudentClassRooms(models.Model):
        student = models.ForeignKey(Student)
        classroom = models.ForeignKey(ClassRoom)
        history = HistoricalRecords()
    

    如果你现在使用:

    StudentClassRooms.objects.create(student=student, classroom=classroom) 而不是 classroom.students.add(student)delete() 而不是 classroom.student.remove(student) 您将在历史表和相同的多对多表中跟踪所有内容。

    【讨论】:

      【解决方案2】:

      这是一个古老的悬而未决的问题,现在可能已经无关紧要,但从查看相关项目的代码来看,ClassRoom 模型的最后一行似乎应该更改为

      history = HistoricalRecords(m2m_fields=['students'])
      

      【讨论】:

      • 感谢@ShacharSh,但我最终决定改用 django-reversion。
      • 感谢分享。如果您碰巧检查了我的答案并且它确实为您解决了问题,如果您能将我的答案标记为有帮助,我将不胜感激
      • ShacharSh,我相信你是对的。虽然如果我查看 Kyruus 的 fork 中的代码更改,我发现管理视图中没有任何更改,所以这可能会使事情变得复杂。
      • @EricPb 我在为 django-reversion 找到正确的代码时遇到了一些困难。是否可以在此处发布您的代码实现作为您问题的答案?这将非常有帮助,谢谢!
      猜你喜欢
      • 2016-05-20
      • 2020-09-29
      • 2020-10-10
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多