如何找到對特定Django模型實例的所有直接外鍵引用?如何查找對實例的所有Django外鍵引用
我想要刪除一條記錄,但我想保留所有引用它的子記錄,所以我試圖在刪除之前用另一條記錄「替換」舊記錄的引用。
This類似的問題引用了Collector類。我想:
obj_to_delete = MyModel.objects.get(id=blah)
new_obj = MyModel.objects.get(id=blah2)
collector = Collector(using='default')
collector.collect([obj_to_delete])
for other_model, other_data in collector.field_updates.iteritems():
for (other_field, _value), other_instances in other_data.iteritems():
# Why is this necessary?
if other_field.rel.to is not type(first_obj):
continue
for other_instance in other_instances:
setattr(other_instance, other_field.name, new_obj)
other_instance.save()
# All FK references should be gone, so this should be safe to delete.
obj_to_delete.delete()
然而,這似乎有兩個問題:
- 有時
collector.field_updates
包含模型和什麼都沒有做我的目標obj_to_delete
場的參考。 - 我的最終
obj_to_delete.delete()
調用失敗,IntegrityErrors抱怨仍然引用它的剩餘記錄,未被收集器捕獲的記錄。
我在做什麼錯?
我只需要一種方法來查找所有FK引用到單個模型實例。我不需要像在Django的標準刪除視圖中使用的任何形式的依賴關係查找。