如果我理解正确,您正在尝试使用 mongoengine 将对象映射到文档架构。
让我们为用户创建一个文档类:
from mongoengine import Document, StringField
class UserDocument(Document):
username = StringField(required=True)
password = StringField(required=True)
email = StringField(required=True)
现在添加一个创建新用户的类方法:
from mongoengine import disconnect, connect, Document, StringField
class UserDocument(Document):
username = StringField(required=True)
password = StringField(required=True)
email = StringField(required=True)
@classmethod
def new(cls):
data = UserDocument(username=cls.username, password=cls.password, email=cls.email)
connect('test_collection')
data.save()
disconnect('test_collection')
据我了解您的问题,您在此示例中的问题是 UserDocument 会意识到 mongoengine 从而违反了依赖倒置原则。这可以通过子类来解决。
首先允许在 UserDocument 中继承:
...
class UserDocument(Document):
meta = {'allow_inheritance': True}
username = StringField(required=True)
...
接下来我们构建孩子:
from user_document import UserDocument
# Maps object to schema
class User(UserDocument):
def __init__(self, *args, **values):
super().__init__(*args, **values)
接下来添加一个create方法:
from user_document import UserDocument
# Maps object to schema
class User(UserDocument):
def __init__(self, *args, **values):
super().__init__(*args, **values)
def create(self, username, password, email):
self.username, self.password, self.email = username, password, email
User.new()
现在我们的 User 对象继承了 UserDocument 字段。可以直接访问 UserDocument.new,也可以使用 User.new() 通过子级访问。
from model import User
username, password, email = 'cool username', 'super secret password', 'mrcool@example.com'
User.create(User, username, password, email)
User 对象知道 UserDocument,而后者又依赖于 mongoengine。
如果我误解或使用了不正确的词汇来描述示例解决方案,我深表歉意。我是相对较新的人,自学成才,没有朋友会编写代码,这使得讨论变得困难。