上下文:我正在编写一个具有多种帐户类型(可能包括建筑物)的 API(使用 Flask 和 MongoEngine)。我需要数据库来保存一些临时帐户,直到特定建筑物注册为止。
这就是我仅引用一种类型的用户的方式:
current_holder_of_stuff = ReferenceField(ActiveUser)
我知道 GenericReferenceField 也是一个选项,但是如果我只想允许两种类型的引用怎么办?有没有类似的东西:
current_holder_of_stuff = ReferenceField(ActiveUser, TempUser)
可以创建一个
User
类型的父类,然后继承ActiveUser
和
TempUser
的类来处理各种用户类型。至于要求
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 执行保存前检查,以确保仅定义了用户或建筑物。