如何让MongoEngine中的Reference Field接受多个Document schema?

问题描述 投票:0回答:1

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

这就是我仅引用一种类型的用户的方式:

current_holder_of_stuff = ReferenceField(ActiveUser)

我知道 GenericReferenceField 也是一个选项,但是如果我只想允许两种类型的引用怎么办?有没有类似的东西:

current_holder_of_stuff = ReferenceField(ActiveUser, TempUser)
python flask mongoengine
1个回答
2
投票

可以创建一个

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 执行保存前检查,以确保仅定义了用户或建筑物。

© www.soinside.com 2019 - 2024. All rights reserved.