如何让参考字段接受 MongoEngine 中的多个文档模式?
How to let a Reference Field accept multiple Document schemas in MongoEngine?
上下文:我正在编写一个 API(使用 Flask 和 MongoEngine),其中包含多种帐户类型,可能包括建筑物。我需要数据库来保存一些临时帐户,直到特定建筑物注册为止。
这就是我只引用一种类型的用户的方式:
current_holder_of_stuff = ReferenceField(ActiveUser)
我知道 GenericReferenceField 也是一个选项,但如果我只想允许两种类型的引用怎么办?有没有类似的:
current_holder_of_stuff = ReferenceField(ActiveUser, TempUser)
非常感谢!
创建 User
类型的父 class,然后是 ActiveUser
和 TempUser
的 have inherited classes 来处理各种用户类型可能会奏效.至于要求 current_holder_of_stuff
是两种可能的文档类型,你不能使用单一的参考字段。由于您已经拒绝使用 GenericReferenceField
,因此一种方法可能是添加一个 属性 方法和一个 StringField
,并带有如下选项:
import mongoegine as mdb
class User(mdb.Document):
name = mdb.StringField()
meta = {'allow_inheritance': True}
class ActiveUser(User):
activation_date = mdb.DateTimeField()
class TempUser(User):
date_limit = mdb.DateTimeField()
class Building(mdb.Document):
address = mdb.StringField()
class Stuff(mdb.Document):
user = mdb.ReferenceField(User)
building = mdb.ReferenceField(Building)
currently_with = mdb.StringField(options=['user','building'],required=True)
@property
def current_holder_of_stuff(self):
if self.currently_with == "user":
return self.user
else:
return self.building
您还可以使用 mongoengine 的 signals 执行预保存检查,以确保只定义了用户或建筑物。
上下文:我正在编写一个 API(使用 Flask 和 MongoEngine),其中包含多种帐户类型,可能包括建筑物。我需要数据库来保存一些临时帐户,直到特定建筑物注册为止。
这就是我只引用一种类型的用户的方式:
current_holder_of_stuff = ReferenceField(ActiveUser)
我知道 GenericReferenceField 也是一个选项,但如果我只想允许两种类型的引用怎么办?有没有类似的:
current_holder_of_stuff = ReferenceField(ActiveUser, TempUser)
非常感谢!
创建 User
类型的父 class,然后是 ActiveUser
和 TempUser
的 have inherited classes 来处理各种用户类型可能会奏效.至于要求 current_holder_of_stuff
是两种可能的文档类型,你不能使用单一的参考字段。由于您已经拒绝使用 GenericReferenceField
,因此一种方法可能是添加一个 属性 方法和一个 StringField
,并带有如下选项:
import mongoegine as mdb
class User(mdb.Document):
name = mdb.StringField()
meta = {'allow_inheritance': True}
class ActiveUser(User):
activation_date = mdb.DateTimeField()
class TempUser(User):
date_limit = mdb.DateTimeField()
class Building(mdb.Document):
address = mdb.StringField()
class Stuff(mdb.Document):
user = mdb.ReferenceField(User)
building = mdb.ReferenceField(Building)
currently_with = mdb.StringField(options=['user','building'],required=True)
@property
def current_holder_of_stuff(self):
if self.currently_with == "user":
return self.user
else:
return self.building
您还可以使用 mongoengine 的 signals 执行预保存检查,以确保只定义了用户或建筑物。