【问题标题】:How is the distinction between class attribute and instance attribute made for mongoengine Document?mongoengine Document 的类属性和实例属性如何区分?
【发布时间】:2016-01-28 20:41:09
【问题描述】:

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

【问题讨论】:

  • 您可以添加一些示例代码来进一步说明您的问题吗?
  • 我想我理解你的问题是你想要 mongodb 中文档之间的通用信息,但它仍然不是 100% 清楚。

标签: python python-2.7 mongoengine flask-mongoengine


【解决方案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"

何时使用EmbeddedDocumentReferenceField 取决于on your data model design

【讨论】:

  • 这三件事中的任何一个都不能解决我的目的。类属性的使用是在该类的实例之间共享一个属性。但我认为在持久化的实体中拥有一个共享变量是没有意义的。
  • mongoengine Document 类的目的是将集合中的文档映射到 python 对象。如果您需要引用其他不适合您的数据模型的变量,那么您应该只使用普通的 python 类来做到这一点。
  • 我可以问一个相关的问题吗?为什么 mongoengine 选择在类级别定义文档,而不是在 __init__() 中定义字段?对于普通的 python 开发人员来说,这将保持它的直观性,并且也使得从(或转向)mongoengine 的转变更加清洁和容易。
  • 这样可以在创建 Document 实例时定义和执行模式。它还允许为每个文档创建但不添加字段。
猜你喜欢
  • 1970-01-01
  • 2018-04-14
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 2011-11-24
  • 1970-01-01
相关资源
最近更新 更多