Skip to main content
 首页 » 编程设计

python之Django : Foreign key set not found after saving object

2024年09月03日26kevingrace

我有一个问题模型和 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 admin 中使用 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 对象也是如此。