背景:
我从两个来源为即将出售的房产收集数据,让我们调用一个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
然而,我显然无法查询这些字段,这将是我列出即将到来的销售时的最终目标。有人向我建议了一个解决方案,该解决方案涉及创建一个覆盖过滤器/排除方法的自定义管理器,这听起来很有希望,但我必须复制模型管理器中的所有属性字段逻辑。
摘要(为清晰起见)
我有:
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
...
我想要一个统一的模型,其中SourceA
和SourceB
之间的公共字段是按优先级排列的,这样,如果SourceB
存在,它就会从SourceB
导出该字段的值,否则它就来自SourceA
。我也想查询这些字段,所以使用属性可能不是最好的方式。。。
问题
有没有更好的方法,我应该考虑重组我的模型(可能结合这两个),还是定制管理器解决方案?
我建议另一种解决方案。那么使用继承呢?您可以创建抽象的基类(https://docs.djangoproject.com/en/1.9/topics/db/models/#abstract-基类)。您可以将所有公共字段放在那里,然后为SaleAnnouncement和SellerMaintainedData创建单独的模型。由于这两个字段都将继承自基本模型,因此您必须仅定义特定于特定模型的字段。