您现在的位置是:网站首页> 编程资料编程资料
详解python中mongoengine库用法_python_
2023-05-26
504人已围观
简介 详解python中mongoengine库用法_python_
一、MongoDB的安装与连接
安装:pip install mongoengine


连接mongodb数据库
from pymongo import MongoClient cli = MongoClient('192.168.124.104', 27017) mongodb = cli['test'] print(mongodb)from mongoengine import connect # 连接到User数据库 connect('user', host='192.168.124.104', port=27017)二、MongoEngine模型介绍
2.1、ODM模型介绍
from mongoengine import Document, StringField class User(Document): email = StringField(required=True) first_name = StringField(max_length=50) last_name = StringField(max_length=50)
2.2、常见数据类型

2.3、数据类型通用参数
- db_field:文档中的field/域/列名称
- required:是否为必填项
- default:默认值
- unique:唯一性约束
- choices:可选择的列表
- primary_key:是否为文档的主键,默认为False
2.4、类属性meta常见配置项
类属性,其配置项为python的dict(字典)
from mongoengine import Document, StringField class User(Document): email = StringField(required=True) first_name = StringField(max_length=50) last_name = StringField(max_length=50) meta = { }常见的配置项:
- db_alias:指定文档所在的数据库(逻辑库)
- collection:指定文档所在的集合
- ordering:指定文档的默认排序规则
- indexes:指定文档的索引规则
2.5、文档的嵌套模型
学生信息数据字典

文档的嵌套场景
情况一,数组-简单数据类型:{'grades': [76, 51, 84]}
from mongoengine import Document, IntField, ListField class Student(Document): grade = ListField(IntField())
情况二,单个文档:{'grade': {'course_name': '语文', 'score': 76}}
from mongoengine import Document, StringField, IntField, ListField, EmbeddedDocument, EmbeddedDocumentField # 自定义类型 class CourseGrade(EmbeddedDocument): course_name = StringField() score = IntField() class Student(Document): grade = EmbeddedDocumentField(CourseGrade)
情况三,数组-文档:{'grades': [{'score': 76}, {'score': 51}]}
from mongoengine import Document, IntField, ListField, EmbeddedDocument, EmbeddedDocumentField # 自定义类型 class CourseGrade(EmbeddedDocument): score = IntField() class Student(Document): grade = ListField(EmbeddedDocumentField(CourseGrade))
完整代码:
from mongoengine import Document, connect, EnumField, StringField, IntField, ListField, EmbeddedDocument, \ EmbeddedDocumentField from enum import Enum # 连接到User数据库 connect('user', host='192.168.124.104', port=27017) class SexEnum(Enum): MAN = '男' WOMAN = '女' class CourseGrade(EmbeddedDocument): """成绩信息(科目、老师、成绩)-被嵌套的文档""" course_name = StringField(max_length=64, required=True, verbose_name='科目') teacher = StringField(max_length=16, verbose_name='老师') score = IntField(min_value=0, max_value=150, required=True, verbose_name='成绩') def __repr__(self): return f"CourseGrade({self.course_name},{self.score})" def __str__(self): return self.__repr__() class Student(Document): """学生信息""" # verbose_name 自定义参数,用于显示定义域的名称 stu_no = IntField(required=True, unique=True, verbose_name='学号') stu_name = StringField(required=True, max_length=16, verbose_name='姓名') sex = EnumField(enum=SexEnum, verbose_name='性别') class_name = StringField(max_length=10, verbose_name='班级') address = StringField(max_length=255, verbose_name='家庭住址') phone_no = StringField(max_length=11, verbose_name='电话号码') age = IntField(min_value=0, max_value=150, verbose_name='年龄') grades = ListField(EmbeddedDocumentField(CourseGrade), verbose_name='成绩数组') meta = { # 指定文档的集合 'collection': 'students', # 指定排序,可以指定多个域。例如:'age':根据年龄升序,'-age':根据年龄降序 'ordering': ['-age'] } def __repr__(self): return f'Grade({self.stu_no}, {self.stu_name})' def __str__(self): return self.__repr__() class Grade(Document): """学生成绩""" # verbose_name 自定义参数,用于显示定义域的名称 stu_no = IntField(required=True, verbose_name="学号") stu_name = StringField(required=True, max_length=16, verbose_name='姓名') sex = EnumField(enum=SexEnum, verbose_name='性别') class_name = StringField(max_length=10, verbose_name='班级') address = StringField(max_length=255, verbose_name='家庭住址') phone_no = StringField(max_length=11, verbose_name='电话号码') age = IntField(min_value=0, max_value=150, verbose_name='年龄') grade = EmbeddedDocumentField(CourseGrade, verbose_name='成绩') meta = { # 指定文档的集合 'collection': 'grades', # 指定排序,可以指定多个域。例如:'age':根据年龄升序,'-age':根据年龄降序 'ordering': ['-age'] } def __repr__(self): return f'Grade({self.stu_no}, {self.stu_name})' def __str__(self): return self.__repr__()三、添加数据
添加数据一般有两种方式:
3.1、方式一
一般步骤:
- 第一步,构造ODM模型类对象:
user=User(username='张三') - 第二步,验证数据:
user.validate() - 第三步,保存数据:
user.save()
模型中的验
- 内置的验证器,如
max_length, min_value - 自定义验证器
模型中自定义验证方法示例代码如下:
import re from mongoengine import StringField from mongoengine.errors import ValidationError def phone_required(value): pattern = r'^1[0-9][10]$' if not re.search(pattern, value): raise ValidationError('请输入正确的手机号') phone_no = StringField(validation=phone_required)方式一示例代码:
import random from model import Student, Grade, SexEnum, CourseGrade class LearnMongoDBEngine(object): def __init__(self, info): self.info = info print(self.info) def add_one_student(self): """新增一个学生信息""" student = Student( stu_no=random.randint(3000, 9999999), stu_name=self.info['name'], sex=random.choice([SexEnum.MAN, SexEnum.WOMAN]), class_name='六年级三班', address=self.info['address'], phone_no=self.info['phone'], age=random.randint(10, 15), grades=[ CourseGrade(course_name='语文', teacher=self.info['teacher'], score=random.randint(1, 100)), CourseGrade(course_name='数学', teacher=self.info['teacher'], score=random.randint(1, 100)), CourseGrade(course_name='英语', teacher=self.info['teacher'], score=random.randint(1, 100)), ] ) print(student, student.grades) result = student.save() return result if __name__ == '__main__': info = {'name': '铁扇公主', 'address': '北京市朝阳区', 'phone': '19121741234', 'teacher': '王老师'} obj = LearnMongoDBEngine(info) obj.add_one_student()mongodb数据库中插入的数据:

3.2、方式二:使用create()方法
User.objects.create(**kwargs)
示例代码:
import random from model import Student, Grade, SexEnum, CourseGrade class LearnMongoDBEngine(object): def __init__(self, info): self.info = info print(self.info) def add_one_student(self): """新增一个学生信息""" result = Student.objects.create( stu_no=random.randint(3000, 9999999), stu_name=self.info['name'], sex=random.choice([SexEnum.MAN, SexEnum.WOMAN]), class_name='六年级三班', address=self.info['address'], phone_no=self.info['phone'], age=random.randint(10, 15), grades=[ CourseGrade(course_name='语文', teacher=self.info['teacher'], score=random.randint(1, 100)), CourseGrade(course_name='数学', teacher=self.info['teacher'], score=random.randint(1, 100)), CourseGrade(course_name='英语', teacher=self.info['teacher'], score=random.randint(1, 100)), ] ) # student = Student( # stu_no=random.randint(3000, 9999999), # stu_name=self.info['name'], # sex=random.choice([SexEnum.MAN, SexEnum.WOMAN]), # class_name='六年级三班', # address=self.info['address'], # phone_no=self.info['phone'], # age=random.randint(10, 15), # grades=[ # CourseGrade(course_name='语文', teacher=self.info['teacher'], score=random.randint(1, 100)), # CourseGrade(course_name='数学', teacher=self.info['teacher'], score=random.randint(1, 100)), # CourseGrade(course_name='英语', teacher=self.info['teacher'], score=random.randint(1, 100)), # ] # ) print(result, resul
相关内容
- python 特殊词汇过滤功能的实现_python_
- 利用Python实现快速批量转换HEIC文件_python_
- Pandas数据类型转换df.astype()及数据类型查看df.dtypes的使用_python_
- Python利用AutoGrad实现自动计算函数斜率和梯度_python_
- Pandas查询数据df.query的使用_python_
- Pandas中df.loc[]与df.iloc[]的用法与异同 _python_
- python 字符串模糊匹配Fuzzywuzzy的实现_python_
- python df遍历的N种方式(小结)_python_
- Python pandas 重命名索引和列名称的实现_python_
- 关于NumPy中asarray的用法及说明_python_
点击排行
本栏推荐
