我有两个Django模型,ModelA
和ModelB
。后者与前者有外键链接。
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。
答案 0 :(得分:0)
由于评论是正确的,以下是问题的答案:
使用您提供给我们的代码,ModelB应该永远不存在,并且您的过滤器查询应该为空。您创建并保存ModelA,并仅使用筛选条件搜索ModelB,该筛选条件搜索链接到ModelA的ModelB实例。
这可能仅在ModelA上有一个post_save处理程序时才有效,该处理程序创建并保存链接到ModelA的ModelB实例。
至于为什么这在生产中有效:这可能通过替换当前* .py文件但尚未发生服务器重启的新代码发生。正如问题的作者发现的那样,有一个MySQL触发器来创建ModelB实例。此触发器在开发系统中不可用。