django:在保存目标模型之前分配外键

django:在保存目标模型之前分配外键,django,foreign-keys,Django,Foreign Keys,假设A和B是django型号,其中A有一个外键字段指向B: a = A() b = B() a.my_b = b b.save() a.save() 令人惊讶的是,a与null一起保存在my_b外键字段中。如果在保存之前或之后选中a.my_b,它确实引用了b实例,但是django似乎在a.my_b=b赋值时而不是在a.save()时评估外键id本身。在复杂的系统和流程中,可能很难更改命令的顺序,因此在将其分配给a之前简单地保存b可能是不切实际的 在save命令之间添加难以置信的语句a.my_b

假设
A
B
是django型号,其中
A
有一个外键字段指向
B

a = A()
b = B()
a.my_b = b
b.save()
a.save()
令人惊讶的是,
a
null
一起保存在
my_b
外键字段中。如果在保存之前或之后选中
a.my_b
,它确实引用了
b
实例,但是django似乎在
a.my_b=b
赋值时而不是在
a.save()
时评估外键id本身。在复杂的系统和流程中,可能很难更改命令的顺序,因此在将其分配给
a
之前简单地保存
b
可能是不切实际的

在save命令之间添加难以置信的语句
a.my_b=a.my_b
是可行的,但在我看来这是一个可怕的解决方法

有没有办法配置django在保存模型实例时重新评估外键?


是否有其他方法可以解决此问题?

有一个Django票证描述了此问题


同时,没有改变行为的配置设置。您必须更改保存和分配操作的顺序,或者执行额外的分配。

当我尝试从嵌套的JSON数据动态创建模型实例时,这一点让我有些困惑。在我的例子中,我无法在处理所有字段之前保存实例(这将导致创建相关实例),因此无法在分配之前保存。相反,我构建了一个函数列表,当所有实例都连接起来时,将调用这些函数。除了每个实例的save方法之外,我还添加了一个
partial(setattr,name,value)
,因此在保存相关实例之前,不可靠的分配都是排队的。遗憾的是#8892看起来不会被修复,但至少会增加一个错误。@pluma你能详细介绍一下你的解决方案吗?我正在处理同样的问题。