上下文:我正在编写一个API(使用Flask和MongoEngine),其中包含多种帐户类型,包括建筑物。我需要数据库来保存一些临时帐户,直到特定的建筑物注册。
这就是我一直引用一种用户的方式:
current_holder_of_stuff = ReferenceField(ActiveUser)
我知道GenericReferenceField也是一个选项,但如果我只想允许两种类型的引用呢?有没有像:
current_holder_of_stuff = ReferenceField(ActiveUser, TempUser)
Muchos thankos!
答案 0 :(得分:2)
创建User
类型的父类,然后ActiveUser
和TempUser
的{{3}}来处理各种用户类型可能会有效。至于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的have inherited classes执行预先存储的检查,以确保只定义了用户或建筑物。