如何处理 django-simple-history 中 Django Cascade 删除的对象?

How to deal with Django Cascade deleted objects in django-simple-history?

提问人:lewis32 提问时间:4/24/2023 更新时间:7/11/2023 访问量:101

问:

当我在对象上使用级联删除时,我的 django-simple-history 有问题。

我的数据库中有几个表继承自其他表,因此我将删除设置为级联。 问题是,当我想查询 django-simple-history 生成的历史对象时,我确实在父表中有一个,但是对于子表中的对象,这些对象被 Django 自动删除,我遇到以下错误:

MyApp.models.parentTable_object.DoesNotExist: parentTable_object matching query does not exist.

如果我理解这个问题,django-simple-history 试图为我删除的对象创建一个 Historical 对象,但失败了,因为它需要它继承的父对象,而此时该对象不再存在。

我不能没有级联,所以我希望这是可能的,因为到目前为止,django-simple-history 已经满足了我的所有期望。

感谢您的帮助

我的环境:

  • 操作系统: Windows 10
  • 浏览器:Firefox
  • Django 简单历史版本:3.1.1
  • Django 版本:4.0.3
  • 数据库版本:django 的集成 SqLite3
python django 级联 django-simple-history

评论

0赞 ruddra 4/24/2023
我认为您应该在存储库上创建一个问题,其中包含有关如何重现错误的所有详细信息: github.com/jazzband/django-simple-history/issues
0赞 lewis32 4/24/2023
@ruddra已经完成了,但将近一年没有回应:/

答:

0赞 DigitalDirk 7/11/2023 #1

让我们看看我是否正确理解了问题,这将是一个示例数据模型:

class Parent(models.Model):  
    name = models.CharField(max_length=100)
    history = HistoricalRecords()

class Child(models.Model):`
    parent = HistoryForeignKey(Parent, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    history = HistoricalRecords()

请注意链接HistoricForeignKey

删除父实例时,无法再获取子对象。

在尝试获取孩子时,您可能会遇到以下问题:DoesNotExist

Child.history.as_of(time_stamp).get(parent=parent)

如果您尝试使用父 ID 获取孩子,例如:

Child.history.as_of(time_stamp).get(parent_id=parent_id)

这样,您仍然可以通过 HistoricalChild 表获取子项。

还要注意 github 上的这个线程得到了更清晰的想法。

在其中一条消息中,此人也提到了您遇到的问题

这样做还有一个好处,就是可以让您知道实例是否源自历史记录,这可能也很有用。但是,我注意到这不适用于链式查找,例如,如果您有一个使用类似 b__c__id 的过滤器的get_object_or_404,在这种情况下它似乎看不到“b”。我敢肯定,另一个补丁也可以工作。

到目前为止,这个补丁还没有制作出来。

我希望这对您有所帮助,如果没有,请告诉我。

评论

0赞 lewis32 7/25/2023
感谢您的详细回答。实际上我确实使用了,但我并没有尝试通过历史模型访问历史对象,而是直接通过历史模型访问历史对象,该模型应该保存原始模型的所有更改。因此,Child 对象的历史对象会引发错误,因为它是在删除父对象后创建的。所以它是 foreignKey 属性链接。嗯,这就是我的理解。HistoricForeignKeyChild.history.as_of(time_stamp).get(parent=parent)