如何在Django中使用mongodb并考虑数据库的灵活结构和查询?

时间:2019-05-22 11:15:02

标签: python django mongodb pymongo djongo

我正在开发在其中使用mongodb的Django应用程序。我的数据库架构正在更改(某些字段会不断删除/添加),那么如何将其与Django集成在一起,以接受更改而又不更改旧数据,又不影响搜索查询的方式?

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

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

使用djongo

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

models.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正确应用呢?我希望可以随时通过添加或删除来更改我的收集字段,并可以随时提取所有数据而不会出错。

0 个答案:

没有答案