代表一个django模型,它结合了其他2个模型的数据

时间:2016-08-03 16:34:56

标签: python django django-models

背景

我从2个来源获取待处理待售物品的数据,让我们调用一个let testView = TestView(frame: CGRectMake(0,0, 100, 100)) self.view.addSubview(testView) ,另一个SaleAnnouncement。它们共享许多相同的字段名称(尽管某些数据只能在一个而不是另一个中找到)。如果某件商品即将出售,则保证为SellerMaintainedData,但不一定是SaleAnnouncement。事实上,只有大约10%的“卖家”在自己的网站上维护相关数据。然而,那些做的,总是有更多的信息,并且数据比公告中的数据更新。此外,“公告”是自由格式文本,在提取相关数据之前需要经过几个处理步骤,因此,模型有一些字段用于在处理的中间步骤中存储数据(部分原因我选择2模型而不是将它们组合成1),而“卖方”数据以整齐的表格格式进行刮削。

问题

我最终希望将它们组合成一个SellerMaintainedData,并实现了一个与前两个模型相关的模型,并且在很大程度上依赖于属性来优先处理数据来自哪个模型。类似的东西:

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。我也想查询这些字段,所以使用属性可能不是最好的方法...

问题

有没有更好的方法,我应该考虑重组我的模型(可能将这些模型结合起来),还是自定义管理器解决方案?

1 个答案:

答案 0 :(得分:0)

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