最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解python中mongoengine庫用法

 更新時(shí)間:2022年07月25日 11:35:51   作者:IT之一小佬  
這篇文章主要介紹了python中mongoengine庫用法,主要包括MongoDB的安裝與連接過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

一、MongoDB的安裝與連接

安裝:pip install mongoengine

連接mongodb數(shù)據(jù)庫

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

 2.3、數(shù)據(jù)類型通用參數(shù)

  • db_field:文檔中的field/域/列名稱
  • required:是否為必填項(xiàng)
  • default:默認(rèn)值
  • unique:唯一性約束
  • choices:可選擇的列表
  • primary_key:是否為文檔的主鍵,默認(rèn)為False

2.4、類屬性meta常見配置項(xiàng)

類屬性,其配置項(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 = {
    }

常見的配置項(xiàng):

  • db_alias:指定文檔所在的數(shù)據(jù)庫(邏輯庫)
  • collection:指定文檔所在的集合
  • ordering:指定文檔的默認(rèn)排序規(guī)則
  • indexes:指定文檔的索引規(guī)則

2.5、文檔的嵌套模型

學(xué)生信息數(shù)據(jù)字典

文檔的嵌套場(chǎng)景

情況一,數(shù)組-簡(jiǎn)單數(shù)據(jù)類型:{'grades': [76, 51, 84]}

from mongoengine import Document, IntField, ListField
class Student(Document):
    grade = ListField(IntField())

情況二,單個(gè)文檔:{'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)

情況三,數(shù)組-文檔:{'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數(shù)據(jù)庫
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ù),用于顯示定義域的名稱
    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='電話號(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ù),用于顯示定義域的名稱
    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='電話號(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模型類對(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='語文', 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='英語', teacher=self.info['teacher'], score=random.randint(1, 100)),
            ]
        )
        print(student, student.grades)
        result = student.save()
        return result
if __name__ == '__main__':
    info = {'name': '鐵扇公主', 'address': '北京市朝陽區(qū)', 'phone': '19121741234', 'teacher': '王老師'}
 
    obj = LearnMongoDBEngine(info)
    obj.add_one_student()

mongodb數(shù)據(jù)庫中插入的數(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='語文', 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='英語', 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='語文', 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='英語', 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ù)庫中插入的數(shù)據(jù):

四、查詢數(shù)據(jù)

結(jié)果集QuerySet的獲?。?code>User.objects,User是模型對(duì)象

常用的查詢方法:

  • all():查詢所有文檔
  • filter():按照條件查詢
  • count():滿足條件的文檔數(shù)
  • sum()/average():求和/求平均數(shù)
  • order_by():排序
  • .skip().limit():分頁

4.1、單個(gè)文檔查詢

  • first():沒有文檔則返回None,User.objects.first()
  • get(**kwargs)

多個(gè)文檔時(shí),異常:MultipleObjectsReturned
沒有文檔時(shí),異常:DoesNotExist
僅有一個(gè)文檔時(shí):返回ODM對(duì)象

示例代碼:

from model import Student
class LearnMongoDBEngine(object):
    def get_one_student(self):
        """查詢一個(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):
        """查詢所有學(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查詢"""
        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、條件查詢

1)比較運(yùn)算符

 在MongoEngine中使用雙下劃線(__)分割。比如:age__gt=12,表示年齡大于12的學(xué)生信息。

2)MongoEngine中的字符串查詢   【i表示不區(qū)分大小寫】

3)多個(gè)條件組合查詢

  • Q函數(shù)的使用:from mongoengine.queryset.visitor import Q
  • 多個(gè)條件同時(shí)滿足:Student.objects.filter(Q(key1=value1) & Q(key2=value2))
  • 多個(gè)條件部分滿足: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):
        """查詢一個(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):
        """查詢所有學(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查詢"""
        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):
        """查詢年齡在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):
        """查詢所有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):
        """查詢大于等于60分的學(xué)生成績(jī)信息"""
        result = Student.objects.filter(grades__score__gte=80)  # 注意這兒寫法
        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ì)

  • 滿足條件的文檔數(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):
        """查詢所有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):
        """查詢所有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、分頁處理

  • 方式一,切片方式: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):
        """
        分頁處理
        :param page: 當(dāng)前是第幾頁
        :param page_size: 每頁有多少數(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í)一般先過濾數(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='語文', 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='英語', 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='語文', 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='英語', teacher=self.info['teacher'], score=random.randint(1, 100)),
        #     ]
        # )
        print(result, result.grades)
        # result = student.save()
        return result
    def get_one_student(self):
        """查詢一個(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):
        """查詢所有學(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查詢"""
        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):
        """查詢年齡在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):
        """查詢所有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):
        """查詢所有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):
        """查詢大于等于60分的學(xué)生成績(jī)信息"""
        result = Student.objects.filter(grades__score__gte=80)  # 注意這兒寫法
        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):
        """
        分頁處理
        :param page: 當(dāng)前是第幾頁
        :param page_size: 每頁有多少數(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è)試代碼
    pass

model.py

from mongoengine import Document, connect, EnumField, StringField, IntField, ListField, EmbeddedDocument, \
    EmbeddedDocumentField
from enum import Enum
#  連接到User數(shù)據(jù)庫
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ù),用于顯示定義域的名稱
    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='電話號(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ù),用于顯示定義域的名稱
    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='電話號(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庫用法詳解的文章就介紹到這了,更多相關(guān)python mongoengine庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python?包中的sched?事件調(diào)度器的操作方法

    python?包中的sched?事件調(diào)度器的操作方法

    sched模塊內(nèi)容很簡(jiǎn)單,只定義了一個(gè)類。它用來最為一個(gè)通用的事件調(diào)度模塊,接下來通過本文給大家介紹python?包之?sched?事件調(diào)度器教程,需要的朋友可以參考下
    2022-04-04
  • python?中賦值,深拷貝,淺拷貝的區(qū)別

    python?中賦值,深拷貝,淺拷貝的區(qū)別

    這篇文章主要介紹了python?中賦值,深拷貝,淺拷貝的區(qū)別,下文利用實(shí)例對(duì)三者進(jìn)行詳細(xì)的解析,具有一的的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-03-03
  • 整理Python中常用的conda命令操作

    整理Python中常用的conda命令操作

    今天給大家?guī)淼氖顷P(guān)于Python的相關(guān)知識(shí),文章圍繞著Python中常用的conda命令行操作展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類任務(wù)

    PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類任務(wù)

    這篇文章主要介紹了PyTorch中的神經(jīng)網(wǎng)絡(luò) Mnist 分類任務(wù),在本次的分類任務(wù)當(dāng)中,我們使用的數(shù)據(jù)集是 Mnist 數(shù)據(jù)集,這個(gè)數(shù)據(jù)集大家都比較熟悉,需要的朋友可以參考下
    2023-03-03
  • python 無損批量壓縮圖片(支持保留圖片信息)的示例

    python 無損批量壓縮圖片(支持保留圖片信息)的示例

    這篇文章主要介紹了python 無損批量壓縮圖片的示例,幫助大家更好的利用python處理圖片,感興趣的朋友可以了解下
    2020-09-09
  • 對(duì)python中的argv和argc使用詳解

    對(duì)python中的argv和argc使用詳解

    今天小編就為大家分享一篇對(duì)python中的argv和argc使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • 詳解Python 正則表達(dá)式模塊

    詳解Python 正則表達(dá)式模塊

    這篇文章主要介紹了Python 正則表達(dá)式模塊詳解,分為兩部分,包括基礎(chǔ)語法總結(jié),re模塊的相關(guān)知識(shí),需要的朋友可以參考下
    2018-11-11
  • Python中g(shù)event模塊協(xié)程使用

    Python中g(shù)event模塊協(xié)程使用

    協(xié)程是一種用戶態(tài)的輕量級(jí)線程,本文主要介紹了Python中g(shù)event模塊協(xié)程使用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • python內(nèi)存動(dòng)態(tài)分配過程詳解

    python內(nèi)存動(dòng)態(tài)分配過程詳解

    這篇文章主要介紹了python內(nèi)存動(dòng)態(tài)分配過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python?Flask中Cookie和Session區(qū)別詳解

    Python?Flask中Cookie和Session區(qū)別詳解

    Flask是一個(gè)使用?Python?編寫的輕量級(jí)?Web?應(yīng)用框架。其?WSGI?工具箱采用?Werkzeug?,模板引擎則使用?Jinja2?。Flask使用?BSD?授權(quán)。Flask也被稱為?“microframework”?,因?yàn)樗褂煤?jiǎn)單的核心,用?extension?增加其他功能,F(xiàn)lask中Cookie和Session有什么區(qū)別呢
    2022-07-07

最新評(píng)論

九寨沟县| 靖边县| 四平市| 大理市| 泰安市| 安国市| 唐海县| 教育| 玉门市| 新巴尔虎左旗| 许昌市| 谢通门县| 伊春市| 应城市| 邻水| 邵东县| 昌乐县| 孟津县| 隆昌县| 富锦市| 独山县| 沁阳市| 乐陵市| 连城县| 平泉县| 山丹县| 酒泉市| 禹城市| 万宁市| 义马市| 武隆县| 屏东市| 堆龙德庆县| 杨浦区| 眉山市| 延川县| 枣阳市| 同江市| 将乐县| 福海县| 肥东县|