mongoengine类型存根,支持bson和pymongo的基本类型
项目描述
mongo-types 
为 mongoengine
提供类型存根,并包含对 pymongo
和 bson
的某些基本类型存根。
允许自动完成和静态类型。
安装
pip install mongo-types
猴子补丁mongoengine的 QuerySet
,以便我们可以在运行时用泛型参数进行类型化
import types
from mongoengine.queryset.queryset import QuerySet
def no_op(self, x):
return self
QuerySet.__class_getitem__ = types.MethodType(no_op, QuerySet)
用法
安装和猴子补丁后,类型应该大部分可以工作,但您可能需要更改编写某些内容的方式。
让 objects
工作
默认情况下,基本文档的类型没有 objects
属性,以便每个文档都可以正确地进行类型化。
这里有一个有用的辅助类,适用于不需要修改 QuerySet
的简单情况。
from typing import Generic, Type, TypeVar
from mongoengine import QuerySet, Document
U = TypeVar("U", bound=Document)
class QuerySetManager(Generic[U]):
def __get__(self, instance: object, cls: Type[U]) -> QuerySet[U]:
return QuerySet(cls, cls._get_collection())
class Page(Document):
meta = {
"collection": "pages",
}
objects = QuerySetManager["Page"]()
organization = fields.StringField()
替换 queryset_class
的用法
之前
from typing import Type
from mongoengine import QuerySet, Document
class PostQuerySet(QuerySet):
def for_org(self, *, org: str) -> QuerySet:
return self.filter(organization=org)
def exists(self) -> bool:
return self.count() > 0
class Post(Document):
meta = {
"collection": "posts",
"queryset_class": SMSLogQuerySet,
}
organization = fields.StringField()
# --snip--
之后
from typing import Type
from mongoengine import QuerySet, Document
class PostQuerySet(QuerySet["Post"]):
def for_org(self, *, org: str) -> QuerySet["Post"]:
return self.filter(organization=org)
def exists(self) -> bool:
return self.count() > 0
class QuerySetManager:
def __get__(self, instance: object, cls: Type[Post]) -> PostQuerySet:
return PostQuerySet(cls, cls._get_collection())
class Post(Document):
meta = {
"collection": "posts",
}
objects = QuerySetManager()
organization = fields.StringField()
# --snip--
复制 @queryset_manager
的行为
之前
from mongoengine import Document, QuerySet, queryset_manager, fields
class UserQuerySet(QuerySet):
def for_org(self, *, org: str) -> QuerySet:
return self.filter(organization=org)
class User(Document):
meta = {
"collection": "users",
"queryset_class": UserQuerySet,
}
is_active = fields.BooleanField()
# --snip--
@queryset_manager
def objects(self, queryset: QuerySet) -> QuerySet:
return queryset.filter(is_active=True)
@queryset_manager
def all_objects(self, queryset: QuerySet) -> QuerySet:
return queryset
maybe_user = User.all_objects.first()
之后
from __future__ import annotations
from typing import Type
from mongoengine import QuerySet, Document
class UserQuerySet(QuerySet["User"]):
def for_org(self, *, org: str) -> UserQuerySet:
return self.filter(organization=org)
class QuerySetManager:
def __get__(self, instance: object, cls: Type[User]) -> UserQuerySet:
return UserQuerySet(cls, cls._get_collection()).filter(is_active=True)
class User(Document):
meta = {
"collection": "users",
}
is_active = fields.BooleanField()
# --snip--
objects = QuerySetManager()
@classmethod
def all_objects(cls) -> UserQuerySet:
return UserQuerySet(cls, cls._get_collection())
maybe_user = User.all_objects().first()
修复“Model”没有属性“id”的问题
Mongoengine 会自动为您定义一个 id
字段。Mongo 类型要求您显式指定 id
,以便类型可以更严格。
class User(Document):
meta = {
"collection": "users",
}
# becomes
class User(Document):
meta = {
"collection": "users",
}
id = fields.StringField(db_field="_id", primary_key=True, default=default_id)
# or if you prefer ObjectIds
class User(Document):
meta = {
"collection": "users",
}
id = fields.ObjectIdField(db_field="_id", primary_key=True, default=ObjectId)
dev
poetry install
# run formatting, linting, and typechecking
s/lint
# build
poetry build -f wheel
# build and publish
poetry publish --build
相关
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。
源代码分发
mongo-types-0.15.1.tar.gz (23.4 kB 查看散列值)
构建分发
mongo_types-0.15.1-py3-none-any.whl (33.7 kB 查看散列值)
关闭
mongo-types-0.15.1.tar.gz 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 0a9deeb7733ea7da5db3711d92e22d93556b522f860bbff82e5df44c53bd06a9 |
|
MD5 | d5edca3e84ffeb9396317ca2dead0f4f |
|
BLAKE2b-256 | 9140e79a6caceb8140326963b4ea8829dd8df0434dc815312430b4518bf80c26 |
关闭
mongo_types-0.15.1-py3-none-any.whl 的散列值
算法 | 散列摘要 | |
---|---|---|
SHA256 | 9417ae5b9a759c09630b5ec7d66904cc333c2d2fcfe75e2760a332ed5e267309 |
|
MD5 | 3da44c81e3e004b05c10ee80d8b5c52b |
|
BLAKE2b-256 | 85dbbb06eb4d979ad02820c1ec96975f0d823daa6e93b7a521463c0fd2b9f2b6 |