Django - 保存(或不保存)模型实例

时间:2017-10-06 15:33:27

标签: python django django-models

我有两个Django模型,ModelAModelB。后者与前者有外键链接。

class ModelA(models.Model):
    item = models.BooleanField(default=True)

class ModelB(models.Model):
    modela = models.ForeignKey(ModelA)
    answer = models.SmallIntegerField(null=True, blank=True)

在生产代码中,保存了ModelA的实例。在同一个函数中,它似乎会自动保存ModelB的实例,因为这是在模板中访问的。

def view(request):

    a = ModelA()
    a.item = True
    a.save()

    b = ModelB.objects.filter(modela_id=a.id)

    return render(request, 'template.html', context=locals())

首先,虽然这是我希望代码工作的方式,但我不确定如何保存ModelB的实例。 (这是继承的代码 - 我无法在代码库中的任何其他位置找到信号或调用ModelB。)

其次,这种行为已停止在本地开发中工作(但仍然可以在生产中使用相同的代码); ModelB未保存,因此b会返回None。我很确定这不是代码问题,因为代码的旧分支具有相同的问题。我已经尝试将我的本地数据库恢复到以前的版本,但无济于事。最近唯一改变的是我压缩了大量的迁移文件。

任何人都可以帮助解决这些问题吗?我正在运行Django 1.11。

1 个答案:

答案 0 :(得分:0)

由于评论是正确的,以下是问题的答案:

使用您提供给我们的代码,ModelB应该永远不存在,并且您的过滤器查询应该为空。您创建并保存ModelA,并仅使用筛选条件搜索ModelB,该筛选条件搜索链接到ModelA的ModelB实例。

这可能仅在ModelA上有一个post_save处理程序时才有效,该处理程序创建并保存链接到ModelA的ModelB实例。

至于为什么这在生产中有效:这可能通过替换当前* .py文件但尚未发生服务器重启的新代码发生。正如问题的作者发现的那样,有一个MySQL触发器来创建ModelB实例。此触发器在开发系统中不可用。