2017-10-06 124 views
-2

我有两个Django模型,ModelAModelB。后者与前者有着外部关系。Django - 模型实例被保存(或不)

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

如果找不到保存ModelB实例的代码,是什么让你认为我们可以通过有限的代码访问? – hspandher

+1

使用你的代码,ModelB不应该存在,你的过滤器查询应该是空的。您可以创建并保存ModelA,并仅使用筛选条件搜索ModelB,该筛选条件搜索链接到ModelA的ModelB实例。这可能只适用于ModelA上的post_save处理程序,该处理程序创建并保存了连接到ModelA的ModelB实例。 至于为什么这在生产中起作用:您确定您看到的生产代码仍然与系统部署时运行的代码相同吗?如果没有重新启动,您可能会看到比生产服务器使用的文件更新的* .py文件... – ingofreyer

+1

是的,抱歉 - 这是张贴在绝望中。你完全正确@ingofreyer - 我发现问题是在MySQL数据库中有这种行为的触发器 - 触发器已经被复制到本地数据库中。绝对没有任何代码可以说这是在发生! – qmsack

回答

0

由于意见是正确的,这里是问题的答案:

有了你给我们的代码,ModelB不应该存在,你的过滤器的查询应该是空的。您可以创建并保存ModelA,并仅使用筛选条件搜索ModelB,该筛选条件搜索链接到ModelA的ModelB实例。

如果您在ModelA上有一个post_save处理程序,它可以创建并保存连接到ModelA的ModelB实例,这只能用。

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

相关问题