gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:40:14 25 4
gpt4 key购买 nike

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

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 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()

因此,StateTaxes 类继承了 BaseTaxes 的属性及其方法(更多详细信息 here )。因为它继承了BaseTaxes类,所以会保存在同一个集合(BaseTaxes)中,查询可以到达所有子类:

 results = BaseTaxes.objects().all()

然后,按子类拆分结果:

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

关于python - 如何使用多个模型指向同一个集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36871447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com