导入djongo第三方模块,使用mongodb作为django的数据库

功能描述

写了一个爬虫项目,集成了scrapy的采集和django的admin后台,scrapy部分用terminal命令采集内容,通过pipline处理后写入mongodb,django的admin后台通过使用ckediter富文本编辑器实现可视化编辑,编辑完并保存后,通过在admin.py中的action中编写数个简单的功能,就能批量代码和文件分别推送到远程数据库和ftp目录。

Django(v3.1.5)的setting.py配置文件的engine默认不支持mongodb,但是要使用django的admin后台又要用自带的ORM models才行。通过借助python的第三方模块djongo可以实现这个需求。

安装djongo

pip install djongo

setting.py文件内容

安装完djongo之后,以下为django项目配置文件中数据库部分的配置,localhost没有设置用户名和密码,可以参见下方的完整配置。

DATABASES = {
    'default': {
        'ENGINE': 'djongo', # 默认为'django.db.backends.sqlite'
        'ENFORCE_SCHEMA': True, # 新增的条目
        'NAME': 'dbname',
        'CLIENT': {
            'host': '127.0.0.1',
            'port': 27017
        }
    }
}

完整配置如下(引用:说说 Django 如何优雅地对接 Mongodb)):

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'ENFORCE_SCHEMA': True,
        'LOGGING': {
            'version': 1,
            'loggers': {
                'djongo': {
                    'level': 'DEBUG',
                    'propogate': False,                        
                }
            },
         },
        'NAME': 'your-db-name',
        'CLIENT': {
            'host': 'host-name or ip address',
            'port': port_number,
            'username': 'db-username',
            'password': 'password',
            'authSource': 'db-name',
            'authMechanism': 'SCRAM-SHA-1'
        }
    }
}

models.py注意事项

使用djongo模块之后,django orm的使用没有什么变化,同样要使用makemigrations和migrate命令建表,以及createsuperuser来设置账密

有一点必须要注意,使用sqlite还有mysql的情况下,默认会给每个表添加id作为自增主键,添加记录的时候可以不用管id,但是使用mongodb的情况下,必须要给记录加id,且id必须为int类型,否则只能写入一条数据,其余全部报错,或者在后台点击文章的时候会显示找不到

migrate之后,发现mongodb同样生成了主键id字段,并添加了唯一约束,在插入数据的时候是不会自动添加的。

导入djongo第三方模块,使用mongodb作为django的数据库

以下为models.py中的数据表:

class Airticle(models.Model):
    url = models.URLField(verbose_name="链接")
    title = models.CharField(max_length=60,verbose_name="标题",null=True,blank=True)
    time = models.CharField(max_length=30,verbose_name="发布时间",null=True,blank=True)
    title_pic = models.ImageField(upload_to="headpic",null=True,verbose_name="图片")
    content = RichTextUploadingField(default="",verbose_name="正文")
    status = models.CharField(max_length=10,choices=(("0","未编辑"),("1","已编辑"),("2","已发布")),default=1,verbose_name="文章状态")

    def __str__(self):
        return self.title
    
    class Meta:
        verbose_name_plural = "采集文章"

处理id的部分代码,获取当前数据记录的数量并+1就是id的值,类似于:

query_set = models.models.Airticle.object.create(
	id = models.Airticle.object.count() + 1,
    # ……
)

query_set.save()

之后修改scrapy的设置,将数据写入由django生成的数据表中,这样使用pymongo或者其他方式导入数据的时候,即便有django用不上的字段也相安无事,这是django原本使用的关系型数据库无法做到的。

导入djongo第三方模块,使用mongodb作为django的数据库

上一篇:models常用字段及参数,orm查询优化, choices参数及实际应用


下一篇:Django项目6 后台管理