3

django-simple-history を使用して ManyToManyField の履歴を保存するにはどうすればよいですか。属性 m2m_filds で HistoricalRecords を使用しましたが、エラーがスローされます:予期しないキーワード引数 'm2m_fields'

4

3 に答える 3

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 は保存されている値をまったく調べません。保存または削除シグナルごとに、新しい履歴バージョンをやみくもに保存します。

彼はまた、フィールド トラッカーがこの仕事をする可能性があるとも言っています。

于 2016-02-10T11:20:29.340 に答える