首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >django中ManyToManyField的历史-简单历史

django中ManyToManyField的历史-简单历史
EN

Stack Overflow用户
提问于 2014-06-13 16:08:00
回答 2查看 2.3K关注 0票数 5

简而言之,我需要在历史上保存我的一个模型的多到多个领域所做的改变。

我可以从:https://github.com/Kyruus/django-simple-history/commit/5ba8d2b4d72819f154a11f297796e6a2bb7172bf中看出M2M是受支持的。然而,每当我对M2M字段进行更改时,它在所有历史上也会发生变化,就好像从未改变过一样。我对django和python很陌生,所以我可能错过了什么。

我的models.py:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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-简单历史记录:

代码语言:javascript
复制
>pip install django-simple-history
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-28 21:10:30

这是一个老的公开问题,到现在为止可能无关紧要,但是从查看所讨论项目的代码来看,似乎应该将ClassRoom模型上的最后一行更改为

代码语言:javascript
复制
history = HistoricalRecords(m2m_fields=['students'])
票数 6
EN

Stack Overflow用户

发布于 2021-08-31 13:41:41

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

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

代码语言:javascript
复制
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),您将在历史表中对所有内容进行跟踪,并且对多个表进行相同的跟踪。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24209655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档