Python 如何使用多个模型指向同一集合?

Python 如何使用多个模型指向同一集合?,python,dynamic,mongoengine,Python,Dynamic,Mongoengine,我有一个可以表示多种数据类型的集合: class Taxes(db.Document): meta = {'collection': 'taxes'} type = db.StringField() # State, local, federal owner = db.ReferenceField(User, unique=True) name = db.StringField() fiscal_year = db.IntField() 我想做的是创建

我有一个可以表示多种数据类型的集合:

class Taxes(db.Document):
    meta = {'collection': 'taxes'}

    type = db.StringField() # State, local, federal
    owner = db.ReferenceField(User, unique=True)
    name = db.StringField()
    fiscal_year = db.IntField()
我想做的是创建一个
dynamicBeddedDocument
,或者将其设置为
DynamicDocument
,以保存不同的模型

例如:

class Taxes(db.Document):
    ...
    # This is made up syntax
    data = db.EmbeddedDocumentField(StateTaxes, LocalTaxes, FederalTaxes)
class BaseTaxes(db.Document):
    name = db.StringField()
    value = db.IntegerField()

    meta = {'allow_inheritance': True}

    def apply_tax(self, value):
        return value*(1+self.value)
或:

目标是做到这一点:

# Embedded Dynamic Document example
taxes = Taxes.objects(owner=current_user).all()
state_taxes = [tax.data for tax in taxes if tax.type == 'state']
state_names = [tax_data.state_name for tax_data in state_taxes]

# Dynamic Document example
taxes = Taxes.objects(owner=current_user).all()
state_taxes = [tax for tax in taxes if tax.type == 'state']
state_names = [tax.state_name for tax in state_taxes]
注意事项:

  • 我必须能够执行1次查询才能返回所有类型**
  • 模型应该分开,以便有清晰的定义
  • 这个例子非常小,将有越来越多的模型具有非常不同的定义**
  • 所有型号都有4个或5个相同的字段
  • 动态数据应该相对容易查询
**这些是我不使用单独集合的主要原因


这是可能的吗?

您可以创建一个基类,该基类涵盖您需要的所有基本属性(字段)和方法。例如:

class Taxes(db.Document):
    ...
    # This is made up syntax
    data = db.EmbeddedDocumentField(StateTaxes, LocalTaxes, FederalTaxes)
class BaseTaxes(db.Document):
    name = db.StringField()
    value = db.IntegerField()

    meta = {'allow_inheritance': True}

    def apply_tax(self, value):
        return value*(1+self.value)
使用此基类,您可以创建不同的版本:

 class StateTaxes(BaseTaxes):
     state = db.StringField()
因此,StateTaxs类继承BaseTaxs及其方法的属性(更多详细信息)。因为它继承了BaseTaxs类,所以它将保存在同一集合(BaseTaxs)中,并且查询可以到达所有子类:

 results = BaseTaxes.objects().all()
然后,按子类拆分结果:

 state_taxes = [item for item in results if isinstance(item,StateTaxes)]

为什么模型必须完全分开?我知道您有
,偶尔需要存储其他属性。为什么不声明一个名为
type
的简单额外字段来存储它是州或地方税的事实呢?事实上,这正是您想要的代码似乎不正确的想法。如果您这样做,那么您可以在类定义中取消
EmbeddedDocumentField
,而只需动态设置属性。从OOP的角度来看,
Taxes
是所有这些模型的基类,因此即使我使用了多个集合,它仍然可以通过多重继承作为基类。模型需要分开,因为它们有多大。每个模型都有10个不同的字段。如果我有10个模型,在一个对象/类上有100个字段。这正是我所寻找的,也是我所做的!