如何让参考字段在MongoEngine中接受多个文档模式?

时间:2015-06-09 15:08:19

标签: python flask mongoengine

上下文:我正在编写一个API(使用Flask和MongoEngine),其中包含多种帐户类型,包括建筑物。我需要数据库来保存一些临时帐户,直到特定的建筑物注册。

这就是我一直引用一种用户的方式:

current_holder_of_stuff = ReferenceField(ActiveUser)

我知道GenericReferenceField也是一个选项,但如果我只想允许两种类型的引用呢?有没有像:

current_holder_of_stuff = ReferenceField(ActiveUser, TempUser)

Muchos thankos!

1 个答案:

答案 0 :(得分:2)

创建User类型的父类,然后ActiveUserTempUser的{​​{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执行预先存储的检查,以确保只定义了用户或建筑物。