1

扩展 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

4

1 回答 1

1

如果您创建两个 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"

2. 嵌入文档

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"

3. 参考文件

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"

何时使用 anEmbeddedDocument与 aReferenceField取决于您的数据模型设计

于 2016-02-04T12:53:13.683 回答