У меня есть следующая модель:
class A:
b = ForeignKey('B')
class B:
a = ForeignKey('A', null=True)
У меня есть несколько методов, которые декодируют объект json и создают дерево объектов A и B.
Предположим, у меня есть объект типа 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 (), они все же нарушают ненулевое ограничение в A.
Я где-то читал, что это связано с тем, как работает ORM и как объекты кешируются каким-либо образом.
Предложенное решение заключалось в следующем:
a = A()
b = B()
b.save()
a.b = b
a.save()
Но по очевидной причине рекурсии это не подходит в моем случае. Поэтому единственное, что я могу обойти, - это предоставить каждому объекту метод, который рекурсивно извлекает каждый объект, который необходимо сохранить, а затем выполнить цикл for, чтобы сохранить каждый объект в правильном порядке. Я действительно хотел бы избежать этого, поскольку, конечно, фактическая модель более сложна и включает в себя более двух классов и более одного внешнего ключа на класс.
Так что, я думаю, мой вопрос прост: есть ли лучший способ или более распространенный способ действовать в таких ситуациях?