首页 > 解决方案 > 如何使用单个外键更改两个模型?

问题描述

所以我有一个Part包含的模型ConnectedTo,它是一个 models.ForeignKey('self').

这应该以与命名所暗示的方式相同的方式起作用。如果一个部件连接到另一个部件,它会被列出。当处理创建的第一个对象并将对象链接到尚未创建的部分时,我的问题就出现了。如果我有一个Part A,那么它什么都没有连接,因为还没有其他对象存在。即使我知道它与B尚不存在的连接。当我创建它时,我可以创建它并将其引用到另一部分,B但这并不能改变ConnectedTo.A

每当添加一些东西时,我都可以轻松地编写一些东西来改变,但是这个系统被设计成相当大的规模,我觉得我需要一个更自动化的解决方案,以免它失控。

标签: djangodatabasedjango-modelsdatabase-design

解决方案


如果我理解你的话,你的问题是,如果它的外键不存在,你就不能创建一个实例。

作为一种解决方案,您可以先创建最深的部分,然后再创建另一个。就像你有链一样A -> B -> C

c = Part.objects.create()
b = Part.objects.create(connected_to=c)
a = Part.objects.create(connected_to=b)

另一种解决方案是None为父实例设置,直到创建新的子实例。如果您需要在孩子之前创建它。使用post_save或使用 save 方法,您可以执行以下操作:

b = Part.objects.create()

c = Part.objects.create()

然后post_save你可以做:

parts = Part.objects.filter(id=b.id)
parts.update(connected_to=c) 
# I didn't use save method here in order to to call post_save again.

推荐阅读