Django:保存对象后未找到外键集

时间:2011-02-06 23:37:27

标签: python django django-models

我有一个问题模型和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)

现在我已经覆盖了问题的保存方法。即使问题已经保存,我也无法在save方法中找到choice_set!我总是在我的日志文件中找到“未找到选项.. zilch”。

更新:我正在管理界面中创建我的问题,'选择'对象正在'内联'创建。

所以修改后的问题是 - 以什么顺序创建'内联'字段/模型和主模型?如何延迟检查save方法中设置的foreignkey,以便'foreignkey_set'变为可见?

1 个答案:

答案 0 :(得分:3)

class Foo(models.Model):
    pass


class Bar(models.Model):
    foo = models.ForeignKey(Foo)

Bar admin中使用Foo的内联时,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的{​​{1}}方法时,内联save对象尚未保存,因此无法查询。因此,如果您需要在管理员中保存Foo实例(使用Bar inlines)时需要访问这些对象,则需要解决此问题。

一种可能的解决方案是附加Bar的{​​{1}}信号,查看它引用的post_save个对象,并执行相关代码。但即使没有创建Foo对象,这也会在每次更改时触发。