表示一个Django模型,它结合了其他两个模型的数据

2024-06-06 09:40:29 发布

您现在位置:Python中文网/ 问答频道 /正文

背景:

我从两个数据源中搜集即将出售的房产的数据,让我们分别调用一个SaleAnnouncement和另一个SellerMaintainedData。它们共享许多相同的字段名(尽管有些数据只能在其中一个字段中找到,而不能在另一个字段中找到)。如果一件商品即将上市销售,那么肯定有SaleAnnouncement,但不一定有SellerMaintainedData。事实上,只有大约10%的“卖家”拥有自己的网站和相关数据。然而,那些这样做,总是有更多的信息和数据是最新的比数据在公告。此外,“公告”是自由格式的文本,在提取相关数据之前需要经过几个处理步骤,因此,模型有一些字段可以在处理的中间步骤中存储数据(部分原因是我选择了2个模型,而不是将它们组合成1个模型),而“卖方”的数据则是以一种整洁的表格格式被刮去的

问题

我最终希望将它们组合成一个SaleItem,并实现了一个与前两个模型相关的模型,该模型在很大程度上依赖于属性来确定数据来自哪个模型的优先级。比如:

@property
def sale_datetime(self):
    if self.sellermaintaineddata and self.sellermaintaineddata.sale_datetime:
        return self.trusteeinfo.sale_datetime
    else:
        return self.latest_announcement and self.latest_announcement.sale_datetime

不过,我显然无法查询这些字段,这将是我在列出即将进行的销售时的最终目标。有人向我建议了一个解决方案,其中包括创建一个自定义管理器来覆盖filter/exclude方法,这听起来很有希望,但我必须复制模型管理器中的所有属性字段逻辑

摘要(为清晰起见)

我有:

class SourceA(Model):
    sale_datetime = ...
    address = ...
    parcel_number = ...
    # other attrs...

class SourceB(Model):
    sale_datetime = ...
    address = ...
    # no parcel number here
    # other attrs...

我想要:

class Combined(Model):
    sale_datetime = # from sourceB if sourceB else from sourceA
    ...

我想要一个统一的模型,其中SourceASourceB之间的公共字段被优先排序,这样,如果SourceB存在,它就从SourceB或者从SourceA导出该字段的值。我也想查询这些领域,所以也许使用属性不是最好的方式

问题

有没有更好的方法,我应该考虑重组我的模型(可能结合这两个),还是定制管理器解决方案是一种可行的方法


Tags: 数据方法模型self管理器datetimemodel属性
1条回答
网友
1楼 · 发布于 2024-06-06 09:40:29

我建议另一种解决办法。使用继承怎么样?您可以创建抽象的基类(https://docs.djangoproject.com/en/1.9/topics/db/models/#abstract-base-classes)。您可以将所有公共字段放在那里,然后为SaleAnnouncement和SellerMaintainedData创建单独的模型。由于这两个字段都将从基本模型继承,因此必须仅为特定模型定义特定的字段

相关问题 更多 >