【发布时间】:2011-11-14 11:37:25
【问题描述】:
我有以下型号:
class A:
b = ForeignKey('B')
class B:
a = ForeignKey('A', null=True)
我有几种方法可以解码 json 对象并创建对象 A 和 B 的树。 假设我有一个 A 类型的对象要保存,我正在尝试写这样的东西
在 A 类中:
def save(self, *args, **kwargs):
self.b.save()
super(A, self).save(*args, **kwargs)
在 B 中:
def save(self, *args, **kwargs):
if self.a:
self.a.save()
super(B, self).save(*args, **kwargs)
这不起作用,即使 A.b 和 B.a 在调用 save() 时被分配了一个 id,它仍然违反了 A 中的非空约束。 我在某处读到,这是由于 ORM 的工作原理以及对象是如何以某种方式缓存的。
提出的解决方案是这样做:
a = A()
b = B()
b.save()
a.b = b
a.save()
但是由于递归的明显原因,这对我来说是不合适的。所以我能想到的唯一解决方法是为每个对象提供一个递归检索每个需要保存的对象的方法,然后执行一个 for 循环以正确的顺序保存每个对象。我真的很想避免这种情况,因为实际模型当然更复杂,并且涉及两个以上的类和每个类多个外键。
所以我想我的问题很简单:在这种情况下是否有更好的方法或更常见的方法?
【问题讨论】:
标签: django recursion foreign-keys save