Python 如何区分mongoengine文档的类属性和实例属性?

Python 如何区分mongoengine文档的类属性和实例属性?,python,python-2.7,mongoengine,flask-mongoengine,Python,Python 2.7,Mongoengine,Flask Mongoengine,对于扩展mongoengine文档的类,如何区分类属性和实例属性?所有属性看起来都像类属性,但在创建两个实例时,这些变量不会共享。 如何使用mongoengine创建类属性和实例属性 ----编辑--- class User(Document): email = StringField(required=True) first_name = StringField(max_length=50) last_name = StringField(max_length=50)

对于扩展mongoengine文档的类,如何区分类属性和实例属性?所有属性看起来都像类属性,但在创建两个实例时,这些变量不会共享。 如何使用mongoengine创建类属性和实例属性

----编辑---

class User(Document):
    email = StringField(required=True)
    first_name = StringField(max_length=50)
    last_name = StringField(max_length=50)
这是mongoengine文档给出的定义用户文档的示例。 按照定义这些属性的方式,它们是类级属性。但是,Document.py和BaseDocument.py会注意这些文件不会在用户的实例之间共享。
我希望具有类级属性,这些属性在实例之间共享,并且在对文档调用save()方法时也会保存到mongodb中。如果创建两个User实例并保存它们,则集合中将有两个文档。如果您希望他们都有共同的信息,那么有几种方法可以实现这一点:

1。默认属性

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)
    last_name = db.StringField(max_length=50)
    usertype = db.StringField(default="web user")


u1 = User(email="u1@example.com", first_name="user", last_name="one").save()
u2 = User(email="u2@example.com", first_name="user", last_name="two").save()

assert u1.usertype == "web user"
assert u2.usertype == "web user"
class UserType(db.EmbeddedDocument):
    role = db.StringField(choices=['Admin','Basic','Guest'])

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)
    last_name = db.StringField(max_length=50)
    usertype = db.EmbeddedDocumentField(UserType)


basic = UserType(role="Basic")
u1 = User(email="u1@example.com", first_name="user", last_name="one", usertype=basic).save()
u2 = User(email="u2@example.com", first_name="user", last_name="two", usertype=basic).save()

assert u1.usertype.role == "Basic"
assert u2.usertype.role == "Basic"
class UserType(db.Document):
    role = db.StringField(choices=['Admin','Basic','Guest'])

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)
    last_name = db.StringField(max_length=50)
    usertype = db.ReferenceField(UserType)


basic = UserType(role="Basic").save()
u1 = User(email="u1@example.com", first_name="user", last_name="one", usertype=basic).save()
u2 = User(email="u2@example.com", first_name="user", last_name="two", usertype=basic).save()

assert u1.usertype.role == "Basic"
assert u2.usertype.role == "Basic"
2。嵌入文档

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)
    last_name = db.StringField(max_length=50)
    usertype = db.StringField(default="web user")


u1 = User(email="u1@example.com", first_name="user", last_name="one").save()
u2 = User(email="u2@example.com", first_name="user", last_name="two").save()

assert u1.usertype == "web user"
assert u2.usertype == "web user"
class UserType(db.EmbeddedDocument):
    role = db.StringField(choices=['Admin','Basic','Guest'])

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)
    last_name = db.StringField(max_length=50)
    usertype = db.EmbeddedDocumentField(UserType)


basic = UserType(role="Basic")
u1 = User(email="u1@example.com", first_name="user", last_name="one", usertype=basic).save()
u2 = User(email="u2@example.com", first_name="user", last_name="two", usertype=basic).save()

assert u1.usertype.role == "Basic"
assert u2.usertype.role == "Basic"
class UserType(db.Document):
    role = db.StringField(choices=['Admin','Basic','Guest'])

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)
    last_name = db.StringField(max_length=50)
    usertype = db.ReferenceField(UserType)


basic = UserType(role="Basic").save()
u1 = User(email="u1@example.com", first_name="user", last_name="one", usertype=basic).save()
u2 = User(email="u2@example.com", first_name="user", last_name="two", usertype=basic).save()

assert u1.usertype.role == "Basic"
assert u2.usertype.role == "Basic"
3。参考文件

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)
    last_name = db.StringField(max_length=50)
    usertype = db.StringField(default="web user")


u1 = User(email="u1@example.com", first_name="user", last_name="one").save()
u2 = User(email="u2@example.com", first_name="user", last_name="two").save()

assert u1.usertype == "web user"
assert u2.usertype == "web user"
class UserType(db.EmbeddedDocument):
    role = db.StringField(choices=['Admin','Basic','Guest'])

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)
    last_name = db.StringField(max_length=50)
    usertype = db.EmbeddedDocumentField(UserType)


basic = UserType(role="Basic")
u1 = User(email="u1@example.com", first_name="user", last_name="one", usertype=basic).save()
u2 = User(email="u2@example.com", first_name="user", last_name="two", usertype=basic).save()

assert u1.usertype.role == "Basic"
assert u2.usertype.role == "Basic"
class UserType(db.Document):
    role = db.StringField(choices=['Admin','Basic','Guest'])

class User(db.Document):
    email = db.StringField(required=True)
    first_name = db.StringField(max_length=50)
    last_name = db.StringField(max_length=50)
    usertype = db.ReferenceField(UserType)


basic = UserType(role="Basic").save()
u1 = User(email="u1@example.com", first_name="user", last_name="one", usertype=basic).save()
u2 = User(email="u2@example.com", first_name="user", last_name="two", usertype=basic).save()

assert u1.usertype.role == "Basic"
assert u2.usertype.role == "Basic"

何时使用
EmbeddedDocument
ReferenceField
取决于。

能否添加一些示例代码来进一步说明您的问题?我想我理解您的问题是,您需要mongodb中文档之间的公共信息,但仍然不是100%清楚。这三件事都不能解决我的问题。类属性的使用是在该类的实例之间共享一个属性。但我认为在持久化的实体中使用共享变量是没有意义的。mongoengine
Document
类的目的是将集合中的文档映射到python对象。如果您需要引用不适合您的数据模型的其他变量,那么您应该使用普通python类来实现;为什么mongoengine选择在类级别定义文档,而不是在_init__;()中定义字段?这将使普通python开发人员能够直观地使用它,并且使从(或转向)mongoengine变得更清晰、更容易。这样,就可以在创建文档实例时定义和实施模式。它还允许为每个文档创建但不添加字段。