詳解python中mongoengine庫(kù)用法
一、MongoDB的安裝與連接
安裝:pip install mongoengine


連接mongodb數(shù)據(jù)庫(kù)
from pymongo import MongoClient
cli = MongoClient('192.168.124.104', 27017)
mongodb = cli['test']
print(mongodb)from mongoengine import connect
# 連接到User數(shù)據(jù)庫(kù)
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、常見(jiàn)數(shù)據(jù)類(lèi)型

2.3、數(shù)據(jù)類(lèi)型通用參數(shù)
- db_field:文檔中的field/域/列名稱(chēng)
- required:是否為必填項(xiàng)
- default:默認(rèn)值
- unique:唯一性約束
- choices:可選擇的列表
- primary_key:是否為文檔的主鍵,默認(rèn)為False
2.4、類(lèi)屬性meta常見(jiàn)配置項(xiàng)
類(lèi)屬性,其配置項(xiàng)為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 = {
}常見(jiàn)的配置項(xiàng):
- db_alias:指定文檔所在的數(shù)據(jù)庫(kù)(邏輯庫(kù))
- collection:指定文檔所在的集合
- ordering:指定文檔的默認(rèn)排序規(guī)則
- indexes:指定文檔的索引規(guī)則
2.5、文檔的嵌套模型
學(xué)生信息數(shù)據(jù)字典

文檔的嵌套場(chǎng)景
情況一,數(shù)組-簡(jiǎn)單數(shù)據(jù)類(lèi)型:{'grades': [76, 51, 84]}
from mongoengine import Document, IntField, ListField
class Student(Document):
grade = ListField(IntField())情況二,單個(gè)文檔:{'grade': {'course_name': '語(yǔ)文', 'score': 76}}
from mongoengine import Document, StringField, IntField, ListField, EmbeddedDocument, EmbeddedDocumentField
# 自定義類(lèi)型
class CourseGrade(EmbeddedDocument):
course_name = StringField()
score = IntField()
class Student(Document):
grade = EmbeddedDocumentField(CourseGrade)情況三,數(shù)組-文檔:{'grades': [{'score': 76}, {'score': 51}]}
from mongoengine import Document, IntField, ListField, EmbeddedDocument, EmbeddedDocumentField
# 自定義類(lèi)型
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數(shù)據(jù)庫(kù)
connect('user', host='192.168.124.104', port=27017)
class SexEnum(Enum):
MAN = '男'
WOMAN = '女'
class CourseGrade(EmbeddedDocument):
"""成績(jī)信息(科目、老師、成績(jī))-被嵌套的文檔"""
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='成績(jī)')
def __repr__(self):
return f"CourseGrade({self.course_name},{self.score})"
def __str__(self):
return self.__repr__()
class Student(Document):
"""學(xué)生信息"""
# verbose_name 自定義參數(shù),用于顯示定義域的名稱(chēng)
stu_no = IntField(required=True, unique=True, verbose_name='學(xué)號(hào)')
stu_name = StringField(required=True, max_length=16, verbose_name='姓名')
sex = EnumField(enum=SexEnum, verbose_name='性別')
class_name = StringField(max_length=10, verbose_name='班級(jí)')
address = StringField(max_length=255, verbose_name='家庭住址')
phone_no = StringField(max_length=11, verbose_name='電話(huà)號(hào)碼')
age = IntField(min_value=0, max_value=150, verbose_name='年齡')
grades = ListField(EmbeddedDocumentField(CourseGrade), verbose_name='成績(jī)數(shù)組')
meta = {
# 指定文檔的集合
'collection': 'students',
# 指定排序,可以指定多個(gè)域。例如:'age':根據(jù)年齡升序,'-age':根據(jù)年齡降序
'ordering': ['-age']
}
def __repr__(self):
return f'Grade({self.stu_no}, {self.stu_name})'
def __str__(self):
return self.__repr__()
class Grade(Document):
"""學(xué)生成績(jī)"""
# verbose_name 自定義參數(shù),用于顯示定義域的名稱(chēng)
stu_no = IntField(required=True, verbose_name="學(xué)號(hào)")
stu_name = StringField(required=True, max_length=16, verbose_name='姓名')
sex = EnumField(enum=SexEnum, verbose_name='性別')
class_name = StringField(max_length=10, verbose_name='班級(jí)')
address = StringField(max_length=255, verbose_name='家庭住址')
phone_no = StringField(max_length=11, verbose_name='電話(huà)號(hào)碼')
age = IntField(min_value=0, max_value=150, verbose_name='年齡')
grade = EmbeddedDocumentField(CourseGrade, verbose_name='成績(jī)')
meta = {
# 指定文檔的集合
'collection': 'grades',
# 指定排序,可以指定多個(gè)域。例如:'age':根據(jù)年齡升序,'-age':根據(jù)年齡降序
'ordering': ['-age']
}
def __repr__(self):
return f'Grade({self.stu_no}, {self.stu_name})'
def __str__(self):
return self.__repr__()三、添加數(shù)據(jù)
添加數(shù)據(jù)一般有兩種方式:
3.1、方式一
一般步驟:
- 第一步,構(gòu)造ODM模型類(lèi)對(duì)象:
user=User(username='張三') - 第二步,驗(yàn)證數(shù)據(jù):
user.validate() - 第三步,保存數(shù)據(jù):
user.save()
模型中的驗(yàn)
- 內(nèi)置的驗(yàn)證器,如
max_length, min_value - 自定義驗(yàn)證器
模型中自定義驗(yàn)證方法示例代碼如下:
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('請(qǐng)輸入正確的手機(jī)號(hào)')
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):
"""新增一個(gè)學(xué)生信息"""
student = Student(
stu_no=random.randint(3000, 9999999),
stu_name=self.info['name'],
sex=random.choice([SexEnum.MAN, SexEnum.WOMAN]),
class_name='六年級(jí)三班',
address=self.info['address'],
phone_no=self.info['phone'],
age=random.randint(10, 15),
grades=[
CourseGrade(course_name='語(yǔ)文', teacher=self.info['teacher'], score=random.randint(1, 100)),
CourseGrade(course_name='數(shù)學(xué)', teacher=self.info['teacher'], score=random.randint(1, 100)),
CourseGrade(course_name='英語(yǔ)', teacher=self.info['teacher'], score=random.randint(1, 100)),
]
)
print(student, student.grades)
result = student.save()
return result
if __name__ == '__main__':
info = {'name': '鐵扇公主', 'address': '北京市朝陽(yáng)區(qū)', 'phone': '19121741234', 'teacher': '王老師'}
obj = LearnMongoDBEngine(info)
obj.add_one_student()mongodb數(shù)據(jù)庫(kù)中插入的數(shù)據(jù):

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):
"""新增一個(gè)學(xué)生信息"""
result = Student.objects.create(
stu_no=random.randint(3000, 9999999),
stu_name=self.info['name'],
sex=random.choice([SexEnum.MAN, SexEnum.WOMAN]),
class_name='六年級(jí)三班',
address=self.info['address'],
phone_no=self.info['phone'],
age=random.randint(10, 15),
grades=[
CourseGrade(course_name='語(yǔ)文', teacher=self.info['teacher'], score=random.randint(1, 100)),
CourseGrade(course_name='數(shù)學(xué)', teacher=self.info['teacher'], score=random.randint(1, 100)),
CourseGrade(course_name='英語(yǔ)', 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='六年級(jí)三班',
# address=self.info['address'],
# phone_no=self.info['phone'],
# age=random.randint(10, 15),
# grades=[
# CourseGrade(course_name='語(yǔ)文', teacher=self.info['teacher'], score=random.randint(1, 100)),
# CourseGrade(course_name='數(shù)學(xué)', teacher=self.info['teacher'], score=random.randint(1, 100)),
# CourseGrade(course_name='英語(yǔ)', teacher=self.info['teacher'], score=random.randint(1, 100)),
# ]
# )
print(result, result.grades)
# result = student.save()
return result
if __name__ == '__main__':
info = {'name': '盧俊義', 'address': '上海市浦東新區(qū)', 'phone': '18721741234', 'teacher': '張老師'}
obj = LearnMongoDBEngine(info)
obj.add_one_student()mongodb數(shù)據(jù)庫(kù)中插入的數(shù)據(jù):

四、查詢(xún)數(shù)據(jù)
結(jié)果集QuerySet的獲取:User.objects,User是模型對(duì)象
常用的查詢(xún)方法:
- all():查詢(xún)所有文檔
- filter():按照條件查詢(xún)
- count():滿(mǎn)足條件的文檔數(shù)
- sum()/average():求和/求平均數(shù)
- order_by():排序
- .skip().limit():分頁(yè)
4.1、單個(gè)文檔查詢(xún)
- first():沒(méi)有文檔則返回None,User.objects.first()
- get(**kwargs)
多個(gè)文檔時(shí),異常:MultipleObjectsReturned
沒(méi)有文檔時(shí),異常:DoesNotExist
僅有一個(gè)文檔時(shí):返回ODM對(duì)象
示例代碼:
from model import Student
class LearnMongoDBEngine(object):
def get_one_student(self):
"""查詢(xún)一個(gè)學(xué)生的信息"""
student_info = Student.objects.first()
print(student_info, student_info.id, student_info.stu_name, student_info.address)
return student_info
def get_all_student(self):
"""查詢(xún)所有學(xué)生的信息"""
student_all_info = Student.objects.all()
print(student_all_info)
return student_all_info
def get_student_by_id(self, pk: str):
"""根據(jù)學(xué)生的id查詢(xún)"""
student_info_id = Student.objects.get(id=pk)
print(student_info_id)
return student_info_id
if __name__ == '__main__':
obj = LearnMongoDBEngine()
obj.get_one_student()
obj.get_all_student()
obj.get_student_by_id('62dcd1f1a0da9e5521e73223')運(yùn)行結(jié)果:

4.2、條件查詢(xún)
1)比較運(yùn)算符

在MongoEngine中使用雙下劃線(xiàn)(__)分割。比如:age__gt=12,表示年齡大于12的學(xué)生信息。
2)MongoEngine中的字符串查詢(xún) 【i表示不區(qū)分大小寫(xiě)】

3)多個(gè)條件組合查詢(xún)
- Q函數(shù)的使用:from mongoengine.queryset.visitor import Q
- 多個(gè)條件同時(shí)滿(mǎn)足:Student.objects.filter(Q(key1=value1) & Q(key2=value2))
- 多個(gè)條件部分滿(mǎn)足:Student.objects.filter(Q(key1=value1) | Q(key2=value2))
from mongoengine.queryset.visitor import Q
from model import Student, Grade, SexEnum
class LearnMongoDBEngine(object):
def get_one_student(self):
"""查詢(xún)一個(gè)學(xué)生的信息"""
student_info = Student.objects.first()
print(student_info, student_info.id, student_info.stu_name, student_info.address)
return student_info
def get_all_student(self):
"""查詢(xún)所有學(xué)生的信息"""
student_all_info = Student.objects.all()
print(student_all_info)
return student_all_info
def get_student_by_id(self, pk: str):
"""根據(jù)學(xué)生的id查詢(xún)"""
student_info_id = Student.objects.get(id=pk)
print(student_info_id)
return student_info_id
def get_student_1(self):
"""獲取大于12歲的學(xué)生信息"""
result = Student.objects.filter(age__gt=12)
print(result)
return result
def get_student_2(self):
"""獲取所有姓李的學(xué)生"""
result = Student.objects.filter(stu_name__startswith='李')
print(result)
return result
def get_student_3(self):
"""查詢(xún)年齡在9~12之間(含)的學(xué)生信息"""
# SELECT * FROM school_student_info WHERE age BETWEEN 9 AND 12;
# db.students.find({'age': {'$gte': 9, '$lte': 12}})
result = Student.objects.filter(Q(age__gte=9) & Q(age__lte=12))
print(result)
return result
def get_student_4(self):
"""查詢(xún)所有12歲以上的男生和9歲以下的女生"""
result = Student.objects.filter(Q(age__gt=12, sex=SexEnum.MAN) | Q(age__lt=9, sex=SexEnum.WOMAN))
print(result)
return result
def get_grade(self):
"""查詢(xún)大于等于60分的學(xué)生成績(jī)信息"""
result = Student.objects.filter(grades__score__gte=80) # 注意這兒寫(xiě)法
print(result)
for i in result:
print(i.grades)
return result
if __name__ == '__main__':
obj = LearnMongoDBEngine()
obj.get_one_student()
obj.get_student_1()
obj.get_student_2()
obj.get_student_3()
obj.get_student_4()
obj.get_grade()運(yùn)行結(jié)果: 【注意:打印信息是由model中__call__函數(shù)設(shè)置決定的】

4.3、聚合統(tǒng)計(jì)
- 滿(mǎn)足條件的文檔數(shù):
User.objects.count(),所有的結(jié)果集都可以使用 - 求和/平均數(shù):
User.objects.filter().sum(field) / User.objects.filter().average(field)
from mongoengine.queryset.visitor import Q
from model import Student, Grade, SexEnum
class LearnMongoDBEngine(object):
def get_student_4(self):
"""查詢(xún)所有12歲以上的男生和9歲以下的女生"""
result = Student.objects.filter(Q(age__gt=12, sex=SexEnum.MAN) | Q(age__lt=9, sex=SexEnum.WOMAN))
print(result)
return result
def get_student_5(self):
"""查詢(xún)所有12歲以上的男生和9歲以下的女生總數(shù)"""
result = Student.objects.filter(Q(age__gt=12, sex=SexEnum.MAN) | Q(age__lt=9, sex=SexEnum.WOMAN)).count()
print(result)
return result
def get_man_sex(self):
"""統(tǒng)計(jì)性別為男的總?cè)藬?shù),并求出其平均年齡和總年齡"""
queryset = Student.objects.filter(sex='男')
print(queryset)
man_num_count = queryset.count()
print(man_num_count)
man_avg_age = queryset.average('age')
print(man_avg_age)
man_sum_age = queryset.sum('age')
print(man_sum_age)
return man_avg_age, man_sum_age
if __name__ == '__main__':
obj = LearnMongoDBEngine()
obj.get_student_4()
obj.get_student_5()
obj.get_man_sex()運(yùn)行結(jié)果:

4.4、排序
- -:倒敘排列
- (+):正序排序,默認(rèn)就是正序
- Student.objects().order_by('field1', '-field2')
from mongoengine.queryset.visitor import Q
from model import Student, Grade, SexEnum
class LearnMongoDBEngine(object):
def get_max_min_age(self):
"""獲取最大年齡和最小年齡的學(xué)生信息"""
queryset_min_age = Student.objects.order_by('age').first()
queryset_max_age = Student.objects.order_by('-age').first()
print(queryset_min_age, queryset_min_age.age)
print(queryset_max_age, queryset_max_age.age)
return '200 OK'
if __name__ == '__main__':
obj = LearnMongoDBEngine()
obj.get_max_min_age()運(yùn)行結(jié)果:

4.5、分頁(yè)處理
- 方式一,切片方式:
User.objects.all()[10:15] - 方式二,.skip().limit():
User.objects.skip(10).limit(5)
from mongoengine.queryset.visitor import Q
from model import Student, Grade, SexEnum
class LearnMongoDBEngine(object):
def paginate(self, page: int = 1, page_size: int = 5):
"""
分頁(yè)處理
:param page: 當(dāng)前是第幾頁(yè)
:param page_size: 每頁(yè)有多少數(shù)據(jù)
:return:
"""
# 方法一:切片
start = (page - 1) * page_size
end = start + page_size
queryset1 = Student.objects.all()[start:end]
print(queryset1)
# 方法二:skip().limit()
queryset2 = Student.objects.skip(start).limit(page_size)
print(queryset2)
return "200 OK"
if __name__ == '__main__':
obj = LearnMongoDBEngine()
obj.paginate(1, 6)
print("*" * 100)
obj.paginate(1, 3)
obj.paginate(2, 3)運(yùn)行結(jié)果:

五、修改和刪除數(shù)據(jù)
5.1、修改數(shù)據(jù)
修改數(shù)據(jù)時(shí)一般先過(guò)濾數(shù)據(jù),再修改
- 修改一條數(shù)據(jù):
User.objects.filter().update_one() - 批量修改數(shù)據(jù):
User.objects.filter().update()

from mongoengine.queryset.visitor import Q
from model import Student, Grade, SexEnum
class LearnMongoDBEngine(object):
def update_one(self):
"""修改一條數(shù)據(jù)"""
queryset = Student.objects.filter(stu_no='2438197')
print(queryset)
result = queryset.update_one(stu_name='白龍馬', phone_no='16452412564')
# result = queryset.update_one(stu_name='白龍馬', unset__phone_no=True)
print(result)
def update_one_2(self):
"""修改一條數(shù)據(jù)"""
queryset = Student.objects.filter(stu_no=3152784).first()
print(queryset)
if queryset:
queryset.stu_name = '沙和尚'
result = queryset.save()
print(result)
return "200 OK"
else:
return "error"
def update_many(self):
"""將年齡10歲的學(xué)生年齡加一歲"""
queryset = Student.objects.filter(age=10)
print(queryset)
queryset.update(inc__age=1)
print(queryset)
return "200 OK"
if __name__ == '__main__':
obj = LearnMongoDBEngine()
obj.update_one()
obj.update_one_2()
obj.update_many()運(yùn)行結(jié)果:

5.2、刪除數(shù)據(jù)
User.objects.filter().delete()
from mongoengine.queryset.visitor import Q
from model import Student, Grade, SexEnum
class LearnMongoDBEngine(object):
def delete_data(self):
"""刪除年齡大于13歲的學(xué)生"""
queryset_start = Student.objects.all()
print(f"刪除前學(xué)生總數(shù)量:{queryset_start.count()}")
queryset = Student.objects.filter(age__gt=13)
print(f'刪除的學(xué)生的數(shù)量:{queryset.count()}')
res = queryset.delete()
print(f"刪除的結(jié)果:{res}")
queryset_end = Student.objects.all()
print(f"刪除后剩余學(xué)生總數(shù)量:{queryset_end.count()}")
if __name__ == '__main__':
obj = LearnMongoDBEngine()
obj.delete_data()運(yùn)行結(jié)果:

附錄:
main.py
import random
from mongoengine.queryset.visitor import Q
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):
"""新增一個(gè)學(xué)生信息"""
result = Student.objects.create(
stu_no=random.randint(3000, 9999999),
stu_name=self.info['name'],
sex=random.choice([SexEnum.MAN, SexEnum.WOMAN]),
class_name='六年級(jí)三班',
address=self.info['address'],
phone_no=self.info['phone'],
age=random.randint(10, 15),
grades=[
CourseGrade(course_name='語(yǔ)文', teacher=self.info['teacher'], score=random.randint(1, 100)),
CourseGrade(course_name='數(shù)學(xué)', teacher=self.info['teacher'], score=random.randint(1, 100)),
CourseGrade(course_name='英語(yǔ)', 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='六年級(jí)三班',
# address=self.info['address'],
# phone_no=self.info['phone'],
# age=random.randint(10, 15),
# grades=[
# CourseGrade(course_name='語(yǔ)文', teacher=self.info['teacher'], score=random.randint(1, 100)),
# CourseGrade(course_name='數(shù)學(xué)', teacher=self.info['teacher'], score=random.randint(1, 100)),
# CourseGrade(course_name='英語(yǔ)', teacher=self.info['teacher'], score=random.randint(1, 100)),
# ]
# )
print(result, result.grades)
# result = student.save()
return result
def get_one_student(self):
"""查詢(xún)一個(gè)學(xué)生的信息"""
student_info = Student.objects.first()
print(student_info, student_info.id, student_info.stu_name, student_info.address)
return student_info
def get_all_student(self):
"""查詢(xún)所有學(xué)生的信息"""
student_all_info = Student.objects.all()
print(student_all_info)
return student_all_info
def get_student_by_id(self, pk: str):
"""根據(jù)學(xué)生的id查詢(xún)"""
student_info_id = Student.objects.get(id=pk)
print(student_info_id)
return student_info_id
def get_student_1(self):
"""獲取大于12歲的學(xué)生信息"""
result = Student.objects.filter(age__gt=12)
print(result)
return result
def get_student_2(self):
"""獲取所有姓李的學(xué)生"""
result = Student.objects.filter(stu_name__startswith='李')
print(result)
return result
def get_student_3(self):
"""查詢(xún)年齡在9~12之間(含)的學(xué)生信息"""
# SELECT * FROM school_student_info WHERE age BETWEEN 9 AND 12;
# db.students.find({'age': {'$gte': 9, '$lte': 12}})
result = Student.objects.filter(Q(age__gte=9) & Q(age__lte=12))
print(result)
return result
def get_student_4(self):
"""查詢(xún)所有12歲以上的男生和9歲以下的女生"""
result = Student.objects.filter(Q(age__gt=12, sex=SexEnum.MAN) | Q(age__lt=9, sex=SexEnum.WOMAN))
print(result)
return result
def get_student_5(self):
"""查詢(xún)所有12歲以上的男生和9歲以下的女生總數(shù)"""
result = Student.objects.filter(Q(age__gt=12, sex=SexEnum.MAN) | Q(age__lt=9, sex=SexEnum.WOMAN)).count()
print(result)
return result
def get_man_sex(self):
"""統(tǒng)計(jì)性別為男的總?cè)藬?shù),并求出其平均年齡和總年齡"""
queryset = Student.objects.filter(sex='男')
print(queryset)
man_num_count = queryset.count()
print(man_num_count)
man_avg_age = queryset.average('age')
print(man_avg_age)
man_sum_age = queryset.sum('age')
print(man_sum_age)
return man_avg_age, man_sum_age
def get_grade(self):
"""查詢(xún)大于等于60分的學(xué)生成績(jī)信息"""
result = Student.objects.filter(grades__score__gte=80) # 注意這兒寫(xiě)法
print(result)
for i in result:
print(i.grades)
return result
def get_max_min_age(self):
"""獲取最大年齡和最小年齡的學(xué)生信息"""
queryset_min_age = Student.objects.order_by('age').first()
queryset_max_age = Student.objects.order_by('-age').first()
print(queryset_min_age, queryset_min_age.age)
print(queryset_max_age, queryset_max_age.age)
return '200 OK'
def paginate(self, page: int = 1, page_size: int = 5):
"""
分頁(yè)處理
:param page: 當(dāng)前是第幾頁(yè)
:param page_size: 每頁(yè)有多少數(shù)據(jù)
:return:
"""
# 方法一:切片
start = (page - 1) * page_size
end = start + page_size
queryset1 = Student.objects.all()[start:end]
print(queryset1)
# 方法二:skip().limit()
queryset2 = Student.objects.skip(start).limit(page_size)
print(queryset2)
return "200 OK"
def update_one(self):
"""修改一條數(shù)據(jù)"""
queryset = Student.objects.filter(stu_no='2438197')
print(queryset)
result = queryset.update_one(stu_name='白龍馬', phone_no='16452412564')
# result = queryset.update_one(stu_name='白龍馬', unset__phone_no=True)
print(result)
def update_one_2(self):
"""修改一條數(shù)據(jù)"""
queryset = Student.objects.filter(stu_no=3152784).first()
print(queryset)
if queryset:
queryset.stu_name = '沙和尚'
result = queryset.save()
print(result)
return "200 OK"
else:
return "error"
def update_many(self):
"""將年齡10歲的學(xué)生年齡加一歲"""
queryset = Student.objects.filter(age=10)
print(queryset)
queryset.update(inc__age=1)
print(queryset)
return "200 OK"
def delete_data(self):
"""刪除年齡大于13歲的學(xué)生"""
queryset_start = Student.objects.all()
print(f"刪除前學(xué)生總數(shù)量:{queryset_start.count()}")
queryset = Student.objects.filter(age__gt=13)
print(f'刪除的學(xué)生的數(shù)量:{queryset.count()}')
res = queryset.delete()
print(f"刪除的結(jié)果:{res}")
queryset_end = Student.objects.all()
print(f"刪除后剩余學(xué)生總數(shù)量:{queryset_end.count()}")
if __name__ == '__main__':
# 自我測(cè)試代碼
passmodel.py
from mongoengine import Document, connect, EnumField, StringField, IntField, ListField, EmbeddedDocument, \
EmbeddedDocumentField
from enum import Enum
# 連接到User數(shù)據(jù)庫(kù)
connect('user', host='192.168.124.104', port=27017)
class SexEnum(Enum):
MAN = '男'
WOMAN = '女'
class CourseGrade(EmbeddedDocument):
"""成績(jī)信息(科目、老師、成績(jī))-被嵌套的文檔"""
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='成績(jī)')
def __repr__(self):
return f"CourseGrade({self.course_name},{self.score})"
def __str__(self):
return self.__repr__()
class Student(Document):
"""學(xué)生信息"""
# verbose_name 自定義參數(shù),用于顯示定義域的名稱(chēng)
stu_no = IntField(required=True, unique=True, verbose_name='學(xué)號(hào)')
stu_name = StringField(required=True, max_length=16, verbose_name='姓名')
sex = EnumField(enum=SexEnum, verbose_name='性別')
class_name = StringField(max_length=10, verbose_name='班級(jí)')
address = StringField(max_length=255, verbose_name='家庭住址')
phone_no = StringField(max_length=11, verbose_name='電話(huà)號(hào)碼')
age = IntField(min_value=0, max_value=150, verbose_name='年齡')
grades = ListField(EmbeddedDocumentField(CourseGrade), verbose_name='成績(jī)數(shù)組')
meta = {
# 指定文檔的集合
'collection': 'students',
# 指定排序,可以指定多個(gè)域。例如:'age':根據(jù)年齡升序,'-age':根據(jù)年齡降序
'ordering': ['-age'],
'strict': False # 設(shè)置非嚴(yán)格校驗(yàn)字段則不需要吧所有字段都聲明
}
def __repr__(self):
return f'Grade({self.stu_no}, {self.stu_name})'
def __str__(self):
return self.__repr__()
class Grade(Document):
"""學(xué)生成績(jī)"""
# verbose_name 自定義參數(shù),用于顯示定義域的名稱(chēng)
stu_no = IntField(required=True, verbose_name="學(xué)號(hào)")
stu_name = StringField(required=True, max_length=16, verbose_name='姓名')
sex = EnumField(enum=SexEnum, verbose_name='性別')
class_name = StringField(max_length=10, verbose_name='班級(jí)')
address = StringField(max_length=255, verbose_name='家庭住址')
phone_no = StringField(max_length=11, verbose_name='電話(huà)號(hào)碼')
age = IntField(min_value=0, max_value=150, verbose_name='年齡')
grades = EmbeddedDocumentField(CourseGrade, verbose_name='成績(jī)')
meta = {
# 指定文檔的集合
'collection': 'grades',
# 指定排序,可以指定多個(gè)域。例如:'age':根據(jù)年齡升序,'-age':根據(jù)年齡降序
'ordering': ['-age']
}
def __repr__(self):
return f'Grade({self.stu_no}, {self.stu_name})'
def __str__(self):
return self.__repr__()官方文檔:
https://docs.mongoengine.org/guide/querying.html
到此這篇關(guān)于python中mongoengine庫(kù)用法詳解的文章就介紹到這了,更多相關(guān)python mongoengine庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?包中的sched?事件調(diào)度器的操作方法
sched模塊內(nèi)容很簡(jiǎn)單,只定義了一個(gè)類(lèi)。它用來(lái)最為一個(gè)通用的事件調(diào)度模塊,接下來(lái)通過(guò)本文給大家介紹python?包之?sched?事件調(diào)度器教程,需要的朋友可以參考下2022-04-04
PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類(lèi)任務(wù)
這篇文章主要介紹了PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類(lèi)任務(wù),在本次的分類(lèi)任務(wù)當(dāng)中,我們使用的數(shù)據(jù)集是 Mnist 數(shù)據(jù)集,這個(gè)數(shù)據(jù)集大家都比較熟悉,需要的朋友可以參考下2023-03-03
python 無(wú)損批量壓縮圖片(支持保留圖片信息)的示例
這篇文章主要介紹了python 無(wú)損批量壓縮圖片的示例,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下2020-09-09
python內(nèi)存動(dòng)態(tài)分配過(guò)程詳解
這篇文章主要介紹了python內(nèi)存動(dòng)態(tài)分配過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07
Python?Flask中Cookie和Session區(qū)別詳解
Flask是一個(gè)使用?Python?編寫(xiě)的輕量級(jí)?Web?應(yīng)用框架。其?WSGI?工具箱采用?Werkzeug?,模板引擎則使用?Jinja2?。Flask使用?BSD?授權(quán)。Flask也被稱(chēng)為?“microframework”?,因?yàn)樗褂煤?jiǎn)單的核心,用?extension?增加其他功能,F(xiàn)lask中Cookie和Session有什么區(qū)別呢2022-07-07

