Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django-正在保存(或未保存)的模型实例_Python_Django_Django Models - Fatal编程技术网

Python 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) 在生产代码中,

我有两种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。

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

使用您提供的代码,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数据库中存在这种行为的触发器-在复制到本地数据库时遗漏了这些触发器。但是,代码中绝对没有任何内容表明发生了这种情况!