提问人:lewis32 提问时间:4/24/2023 更新时间:7/11/2023 访问量:101
如何处理 django-simple-history 中 Django Cascade 删除的对象?
How to deal with Django Cascade deleted objects in django-simple-history?
问:
当我在对象上使用级联删除时,我的 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
答:
让我们看看我是否正确理解了问题,这将是一个示例数据模型:
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”。我敢肯定,另一个补丁也可以工作。
到目前为止,这个补丁还没有制作出来。
我希望这对您有所帮助,如果没有,请告诉我。
评论
HistoricForeignKey
Child.history.as_of(time_stamp).get(parent=parent)
上一个:Zsh 的历史添加没有线索
评论