专栏首页州的先生借Djongo之力,在Django中无痛使用MongoDB数据库

借Djongo之力,在Django中无痛使用MongoDB数据库

编程应用、实战教程,不容错过

Django框架为我们提供了简洁方便的ORM模型供我们对数据库进行各种操作,但是这个“数据库”却并不包括NoSQL的典型——MongoDB。

随着互联网产业的发展,MongoDB数据库的应用越来越广泛,但是Django默认的ORM模型不支持MongoDB很是让人为难。不少Django初学者也会到处询问,如何才能在Django中使用MongoDB。

在这里,州的先生(https://zmister.com)介绍一种方法,借助第三方模块——Djongo来在Django中集成MongoDB数据库。

- 安装与配置 -

Djongo的项目官方地址为:https://nesdis.github.io/djongo/,我们可以通过pip命令直接安装djongo:

pip install djongo

在安装完成之后,我们就可以直接在Django中配置MongoDB数据库的信息了。

在正常情况下,我们的Django项目中数据库在settings.py文件中进行配置,其一般配置如下所示:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

而我们使用Djongo的话,变化也不大,如下所示:

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'NAME': 'MongoDB数据库的名称',
    }
}

可以发现,这与Django原始的数据库配置方法是一模一样的,所不同的是,数据库的引擎使用了djongo而非Django官方提供的数据库封装引擎。

我们用一个新的Django项目来演示一下djongo的使用。

首先创建Django项目和应用:

然后修改项目的settings.py文件,填写MongoDB数据库的配置信息,Djongo提供了如下参数供我们设置数据库的信息:

DATABASES = {
   'default': {
      'ENGINE': 'djongo',
      'ENFORCE_SCHEMA': True,
      'NAME': 'your-db-name',
      'HOST': 'host-name or ip address',
      'PORT': port_number,
      'USER': 'db-username',
      'PASSWORD': 'password',
      'AUTH_SOURCE': 'db-name',
      'AUTH_MECHANISM': 'SCRAM-SHA-1',
      'REPLICASET': 'replicaset',
      'SSL': 'ssl',
      'SSL_CERTFILE': 'ssl_certfile',
      'SSL_CA_CERTS': 'ssl_ca_certs',
      'READ_PREFERENCE': 'read_preference'
   }
}

我们的数据库是本地的数据库,所以只需要设置一部分信息即可,其如下所示:

DATABASES = {
   'default': {
      'ENGINE': 'djongo',
      'ENFORCE_SCHEMA': True,
      'NAME': 'djongo_example',
      'HOST': '127.0.0.1',
      'PORT': 27017,
   }
}

这样,MongoDB在Django中的 配置就完成了,我们下面可以定义一些模型。

- 定义模型 -

Djongo的一大特点是可以无缝地衔接Django的ORM语法,包括模型定义的语法和模型操作的语法。现在,我们就为Django项目定义一些模型。

在默认情况下,Django应用的模型在其目录下的models.py文件中定义。models.py文件初始化状态下只有如下一行代码:

from django.db import models

这是Django数据库封装的模型类,我们需要将其修改为Djongo提供的模型类,如下所示:

from djongo import models

然后,就可以按照Django的方式来定义模型了。在这里,我们定义了一个News()模型,用于存储新闻:

class News(models.Model):
    title = models.CharField(verbose_name="标题",max_length=50)
    author = models.CharField(verbose_name="作者",max_length=10)
    desc = models.CharField(verbose_name="简介",max_length=100)
    content = models.TextField(verbose_name="正文")
    create_time = models.DateTimeField(auto_now_add=True)
    update_time = models.DateTimeField(auto_now=True,auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        verbose_name = '新闻'
        verbose_name_plural = verbose_name

- 生成模型 -

定义好模型之后,继续按照Django模型的使用方式,生成数据库迁移,并执行迁移:

python manage.py makemigrations app&
python manage.py migrate

命令的执行信息如下所示:

和使用SQL数据库一样,Django为新项目创建了我们定义的模型还有一些认证管理相关的表,这是否是真的呢,我们去MongoDB数据库里面查看一下:

MongoDB数据库里面果然生成了一系列的数据表。

- 使用Django Admin -

经过上面的演示,我们可以发现借助于Djongo模块,我们可以无痛地以Django ORM的方式来使用MongoDB数据库。那么作为Django重量级的admin后台功能,是否能够支持呢?我们继续下面的演示。

首先,继续在命令行中创建一个超级用户:

python manage.py createsuperuser

其过程与使用其他SQL数据库无异:

接着,我们将刚刚创建的News()模型添加到admin中,在admin.py中进行设置:

from app.models import News
admin.site.register(News)

随后,运行测试服务器:

我们顺利地访问了首页,顺利地访问了后台页面、并且顺利地登录了进去:

- 数据操作 -

除此之外,我们最关心的还是对数据操纵是否方便。我们先在后台界面尝试一下新增数据:

显示新增成功了,我们去MongoDB里面看看是否存在:

确实是新增成功了。下面,我们通过Django Shell演示一下对MongoDB数据库的增删改查操作,结果如下所示:

也是很顺利的。

- 最后 -

经过上面初步的演示在Django中借助djongo模块来使用MongoDB,可以发现其还是很方便的,优点在于其改动微乎其微,兼容性特别强。

推荐大家在测试环境下充分地进行测试使用,如果没有问题,那么可以谨慎在生产环境中进行部署。更多的使用方法和问题,大家可以访问djongo项目官网:https://nesdis.github.io/djongo/ 和它的GitHub项目地址:https://github.com/nesdis/djongo/

欢迎留言讨论:)

本文分享自微信公众号 - 州的先生(zmister2016),作者:州的先生

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • djongo:Django和MongoDB连接器

    作者:小江,python爱好者,自学中,尝试爬虫、Django开发以及大数据,非CS科班出身。在校主要用MATLAB,现工作中偶尔使用python。博客主页:h...

    Python中文社区
  • 说说 Django 如何优雅地对接 Mongodb

    近来在研究 Django 对接 MongoDB 数据库,遇到一些坑,自己随便做下总结。

    猴哥yuri
  • MongoDB在这里比PostgreSQL慢了7倍

    最近有需求,要将一个局域网Web数据平台迁移到线上,顺带着,本地服务使用的PostgreSQL也要替换成国内某云的MongoDB。

    州的先生
  • Python2.6低版本Python如何实现爬虫功能

    之前我在文章中实现了用requests库爬取腾讯疫情数据的功能。但是我再Linux服务器上运行那个程序却出现了意想不到的情况。运行结果

    震八方紫面昆仑侠
  • Python技术周刊:第 8 期

    欢迎来到《Python技术周刊》这是第8期,每周六发布,让我们直接进入本周的内容。由于微信不允许外部链接,你需要点击页尾左下角”阅读原文“,才能访问文中的链接。

    TalkPython
  • mongodb与mysql相比的优缺点

    与关系型数据库相比,MongoDB的优点: ①弱一致性(最终一致),更能保证用户的访问速度: 举例来说,在 传统的关系型数据库中,一个COUNT类型的操作会锁...

    wangxl
  • Python周刊:第 2 期

    TalkPython
  • 无痛使用 Django+xAdmin+MongoDB

    前几天开始自己在做些日志的分析的小玩具,要分析手搜的用户访问情况,工具很简单,处理逻辑也很简单——从kafka拿nginx日志,然后处理完保存的数据库中,然后以...

    the5fire
  • Flask与Django的比较

    Flask确实很“轻”,不愧是Micro Framework,从Django转向Flask的开发者一定会如此感慨,除非二者均为深入使用过 Flask自由、灵活,...

    py3study

扫码关注云+社区

领取腾讯云代金券