【问题标题】:How to change two models using a single foreign key?如何使用单个外键更改两个模型?
【发布时间】:2020-03-21 14:56:59
【问题描述】:

所以我有一个模型Part,其中包含ConnectedTo,即models.ForeignKey('self')

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

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

【问题讨论】:

  • 我不确定你为什么需要信号。为什么不只是B.objects.create(..., connectedTo=A)
  • @PedramParsian 这可能有用...我认为保存后可能会有所帮助。我会试一试,让你知道
  • @DanielRoseman 因为这只会为 B 更改它。在那种情况下,'A.ConnectedTo' 仍然为空
  • @DanielRoseman 抱歉,这可能是问题所在!我对数据库设计相当缺乏经验。我认为这可能是多对多?我没有对可以将多少个零件附加到哪个零件上设置任何限制。但问题是当我说 A 部分连接到 B 部分时,逻辑上 B 部分也连接到 A 部分。
  • @DanielRoseman 完美!谢谢你。这对我有用!我遇到的唯一问题是它现在不再显示为我的数据库表中的列。这是为什么呢?

标签: django database django-models database-design


【解决方案1】:

如果我理解正确,您的问题是,如果实例的外键不存在,则无法创建实例。

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

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

另一种解决方案是为父实例设置None,直到创建新的子实例。如果您需要在孩子之前创建它。使用post_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.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-28
    • 2015-12-21
    • 1970-01-01
    • 2019-07-30
    • 1970-01-01
    • 2012-08-08
    • 2017-10-24
    • 1970-01-01
    相关资源
    最近更新 更多