2016-08-03 74 views
0

背景结合数据的Django模型:代表从其他2款

我凑2个来源出售即将到来的性能数据,让我们称之为一个SaleAnnouncement和其他SellerMaintainedData。他们共享许多相同的字段名称(尽管一些数据只能在一个中找到,而不能在另一个中找到)。如果某件物品即将出售,则保证是SaleAnnouncement,但不一定是SellerMaintainedData。实际上,只有大约10%的“卖家”在自己的网站上维护相关数据。但是,那些确实拥有更多信息,并且数据比公告中的数据更新。此外,“公告”是自由形式的文本,在提取相关数据之前需要经过几个处理步骤,因此,该模型有一些字段用于在中间处理步骤中存储数据(部分原因是我选择了2模型,而不是将它们合并为1),而“卖家”数据则以整洁的表格格式进行挖掘。

问题

我最终会喜欢把它们组合成一个SaleItem,并实施了这是关系到以前的2款机型,并在很大程度上依赖于性能优先的数据来自哪个模型从模型。例如:

@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 
    ... 

我想去的地方SourceASourceB之间的公共领域是优先所以一个统一的模式如果SourceB存在,则从导出该字段的值或者它来自SourceA。我也想这些领域,所以也许使用性质来查询是不是最好的办法...

问题

有没有更好的办法,我应该考虑转型我的模型(可能合并这2)还是定制经理解决方案的路要走?

回答

0

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

+0

虽然这似乎解决了常见字段形式的重复代码问题,但它并没有解决将项目链接在一起代表一个'SaleItem'的更大问题,这使我可以将它们作为统一模型来查询。如果有什么内容类型框架看起来比抽象基类更适合,但即使这似乎并没有解决统一我正在寻找 –

+0

我真的很抱歉,我一定误解了你的问题。我会去定制经理的方法。也许这样的一个http://stackoverflow.com/questions/17968501/single-custom-manager-for-multiple-models-in-django? – mateuszb