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

标签 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)

现在我已经重写了问题的保存方法。即使保存问题后,我也无法在保存方法中找到 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

这意味着当调用 Foosave 方法时,内联 Bar 对象尚未保存,因此无法保存不容质疑。因此,如果您需要在管理员中保存 Foo 实例时访问这些对象(使用 Bar 内联),则需要解决这个问题。

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

关于python - Django : Foreign key set not found after saving object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4916981/

相关文章:

Django 更新/删除 View 。处理用户权限

python - Django 类型错误 : force_authenticate() missing 1 required positional argument: 'self'

python - 针对峰值需求优化 django 和 mysql

python - 为什么使用 Armadillo 矩阵和 pybind11 可能会导致堆损坏?

javascript - 发布的 Ajax 发送的数据似乎没有出现在 Django View 中

带有通过参数的 Django 外键

python - Apache-Beam 将序列号添加到 PCollection

python - Django Translation - 翻译动态字符串

python - 模型编辑的 Django 内联链接

python - 有没有一种聪明的方法来使用 Django ORM 获取上一个/下一个项目?