Python Django-正在保存(或未保存)的模型实例
我有两种Django型号,Python Django-正在保存(或未保存)的模型实例,python,django,django-models,Python,Django,Django Models,我有两种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
。后者与前者有一个外键链接
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。由于评论是正确的,下面是问题的答案: 使用您提供的代码,ModelB应该永远不存在,并且您的过滤器查询应该为空。您可以创建并保存ModelA,并且仅使用搜索链接到ModelA的ModelB实例的筛选条件搜索ModelB 只有在ModelA上有一个post_save处理程序,该处理程序创建并保存链接到ModelA的ModelB实例时,这才可能起作用
至于这在生产中起作用的原因:可以通过新代码替换当前的*.py文件来实现,但还没有重新启动服务器。正如问题的作者所发现的,创建ModelB实例时有一个MySQL触发器。此触发器在开发系统中不可用。如果您找不到保存ModelB实例的代码,您认为我们可以在有限的代码访问权限下使用它吗?对于您的代码,ModelB应该永远不存在&您的筛选查询应该为空。您可以创建并保存ModelA,并且仅使用搜索链接到ModelA的ModelB实例的筛选条件搜索ModelB。只有在ModelA上有一个post_save处理程序,该处理程序创建并保存链接到ModelA的ModelB实例时,这才可能起作用。至于为什么这在生产中有效:您确定看到的生产代码仍然与部署系统时运行的代码相同吗?如果不重新启动,您可能会看到比生产服务器使用的文件更新的*.py文件…是的,抱歉-这是在绝望中发布的。你完全正确@ingofreyer-我发现问题在于MySQL数据库中存在这种行为的触发器-在复制到本地数据库时遗漏了这些触发器。但是,代码中绝对没有任何内容表明发生了这种情况!