1

我正在开发一个使用 mongodb 的 Django 应用程序。我的数据库架构正在发生变化(某些字段被不断删除/添加),那么如何以一种在不更改旧数据且不影响搜索查询的情况下接受更改的方式将其与 Django 集成?

我搜索了可用的库,发现以下内容:

  • mongoenginedjango-mongodb-engine:mongoengine 暂时不支持并且没有更新,django-mongodb-engine 也需要一个分叉的旧 django-nonrel 包。这与问题相匹配:在 django 中直接使用 pymongo
  • djongo:最初它可以在 python 和 Django 的最新版本中正常工作,并且它可以接受我的数据库模型中的更改而无需迁移,并且 Django 管理面板工作正常。后来,在应用了一些更改后,我在查询数据库或在管理面板中列出数据时遇到了问题。如果更改包括已删除的字段,则旧数据无法适应新模型。
  • pymongo:缺点是我不能使用 django 模型或面板,我必须构建自己的数据库抽象层,但优点是我将对数据库拥有更高的控制权。就像直接在 django 中使用 pymongo 中的第一个解决方案一样,然后我可以为我将拥有的不同数据库结构构建一些层

使用 djongo

假设我有一个名为 Test 的模型:

模型.py

from djongo import models

class Test(models.Model):
    x = models.CharField(max_length=100)
    y = models.CharField(max_length=100)

我创建了一个新对象,如下所示:

{
  _id: ObjectId("..."),
  x: "x1",
  y: "y1"
}

然后,我删除了y字段并添加了一个名为z的新字段,然后我创建了一个新对象,因此创建如下:

{
  _id: ObjectId("..."),
  x: "x2",
  z: "z2"
}

现在,我想提取所有收集数据,如下所示:

python manage.py shell
>>Test.objects.all()
Error as field "y" is not exist in the model
>>Test.objects.filter(z="z2")
Error as field "y" is not exist in the model

我可以理解它不能映射到新的更改模型,但我希望至少没有错误地忽略旧字段,就像直接在 mongodb 中的查询一样。

根据我的要求,使用djongo的方法是错误的吗?或者有什么办法可以解决这个问题吗?如果不是,如何使用 pymongo 正确应用它?我希望随时通过添加或删除来更改我的集合字段,并随时提取所有数据而不会出错。

4

0 回答 0