Django-Mongo模型重构时的默认行为

时间:2012-10-08 20:30:26

标签: django mongodb django-models

我不完全确定这个引擎是如何工作的,但是让我设置一个场景。我有一个Django-Mongo项目,比如说模型类:

class BaseModel(models.Model):
    created_at = models.DateTimeField(null=False, auto_now_add=True)
    modified_at = models.DateTimeField(null=False, auto_now=True)

我创建了一堆基础模型,项目中的一切都很可爱,我获得了大量数据。然后,项目后来增长,我们需要扩展BaseModel。它突然变成:

class BaseModel(models.Model):
    created_at = models.DateTimeField(null=False, auto_now_add=True)
    modified_at = models.DateTimeField(null=False, auto_now=True)
    active = models.BooleanField(default=True)

所以我得到mongo将允许我在不必触摸数据库的情况下更改它,但是说我接下来要做的是做一个查询:

BaseModel.objects.filter(active=True)

我是否应该期望需要使用默认但尚未访问的旧记录才会显示在此查询中?或者我是否需要针对查询引擎执行任何特定操作才能意识到我要查找的值与默认值匹配?

1 个答案:

答案 0 :(得分:0)

好的,经过一些试验和错误后找到了答案。当Django执行查询时,它会查看Mongo在数据库中的含义并忽略任何默认设置。但是,当你已经得到一个对象时,Django会将默认值放入内存中的对象中(但不会放在Mongo记录中)。

这看起来很糟糕。这意味着,在我们可以查询重构的字段之前,我们需要做一次这样的事情:

for mod in BaseModel.objects.all():
    mod.save()

毋庸置疑,这可能是一个非常昂贵的查询。值得庆幸的是,它只需要运行一次,但仍然可以。

如果有更好的选择,那就太棒了。