如何使用多个模型指向同一个集合?
How can I use multiple models to point to the same collection?
我有一个可以表示多种数据类型的集合:
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()
我想要做的是拥有一个 DynamicEmbeddedDocument
或将其设为 DynamicDocument
以容纳不同的模型。
例如:
class Taxes(db.Document):
...
# This is made up syntax
data = db.EmbeddedDocumentField(StateTaxes, LocalTaxes, FederalTaxes)
或:
class Taxes(db.DynamicDocument):
...
class StateTaxes(Taxes):
state_name = db.StringField()
class LocalTaxes(Taxes):
locality_name = db.StringField()
这样做的目标是:
# 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 来涵盖您需要的所有基础属性(字段)和方法。例如:
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 你可以创建不同的版本:
class StateTaxes(BaseTaxes):
state = db.StringField()
因此 StateTaxes class 继承了 BaseTaxes 的属性及其方法(更多详细信息 here)。因为它继承了BaseTaxesclass,所以会保存在同一个集合(BaseTaxes)中,查询可以到达所有subclasses:
results = BaseTaxes.objects().all()
然后,将结果拆分为 subclass:
state_taxes = [item for item in results if isinstance(item,StateTaxes)]
我有一个可以表示多种数据类型的集合:
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()
我想要做的是拥有一个 DynamicEmbeddedDocument
或将其设为 DynamicDocument
以容纳不同的模型。
例如:
class Taxes(db.Document):
...
# This is made up syntax
data = db.EmbeddedDocumentField(StateTaxes, LocalTaxes, FederalTaxes)
或:
class Taxes(db.DynamicDocument):
...
class StateTaxes(Taxes):
state_name = db.StringField()
class LocalTaxes(Taxes):
locality_name = db.StringField()
这样做的目标是:
# 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 来涵盖您需要的所有基础属性(字段)和方法。例如:
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 你可以创建不同的版本:
class StateTaxes(BaseTaxes):
state = db.StringField()
因此 StateTaxes class 继承了 BaseTaxes 的属性及其方法(更多详细信息 here)。因为它继承了BaseTaxesclass,所以会保存在同一个集合(BaseTaxes)中,查询可以到达所有subclasses:
results = BaseTaxes.objects().all()
然后,将结果拆分为 subclass:
state_taxes = [item for item in results if isinstance(item,StateTaxes)]