我有一个问题模型和 mcq 选择模型,它们具有问题的外键。
class Question(models.Model):
statement = models.TextField(max_length=1024)
def save(self, *args, **kwargs):
super(Question,self).save(*args,**kwargs)
#ques = Question.objects.get(id = self.id)
f = open('/tmp/prj/log.txt', 'w')
choiceobjs = self.choice_set.all()
if choiceobjs:
f.write("choices found")
else:
f.write("choices not found.. zilch")
f.close()
class Choice(models.Model):
value = models.TextField(max_length=1024)
question = models.ForeignKey(Question)
现在我已经重写了问题的保存方法。即使保存问题后,我也无法在保存方法中找到 choice_set!我的日志文件中总是出现“未找到选项..zilch”。
更新:我正在管理界面中创建我的问题,并且“选择”对象正在“内联”创建。
所以修改后的问题是 - “内联”字段/模型和主模型按照什么顺序创建?如何延迟在保存方法中检查外键设置,以便“foreignkey_set”变得可见?
最佳答案
class Foo(models.Model):
pass
class Bar(models.Model):
foo = models.ForeignKey(Foo)
当在 Foo
管理中使用 Bar
的内联时,Django 必须首先保存 Foo
对象,因为 Bar
对象需要主键才能在 ForeignKey
中引用它:
self.save_model(request, new_object, form, change=False)
form.save_m2m()
for formset in formsets:
self.save_formset(request, form, formset, change=False)
http://code.djangoproject.com/browser/django/trunk/django/contrib/admin/options.py#L870
这意味着当调用 Foo
的 save
方法时,内联 Bar
对象尚未保存,因此无法保存不容质疑。因此,如果您需要在管理员中保存 Foo 实例时访问这些对象(使用 Bar 内联),则需要解决这个问题。
一种可能的解决方案是附加到 Bar
的 post_save
信号,查看它正在引用哪个 Foo
对象,并执行相关的代码。但这会在每次更改时触发,即使没有创建 Foo 对象。
关于python - Django : Foreign key set not found after saving object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4916981/