2016-01-22 27 views
0

我想要同一模型的两个版本,但仍然从OneToOneField的反向关系中受益。将OneToOneField与多个版本的数据一起使用

例如,让我们说,我有以下型号:

class Company(models.Model): 
    exists = models.BooleanField() 

class ExtraInforation(models.Model): 
    company = models.OneToOneField(Company) 
    wealthy = models.BooleanField() 

此时我的代码使用OneToOneField反向关系的光彩,做所有的地方company.extrainformation电话。

然后我得到一个新的要求:我们不能相信ExtraInformation而不先验证它! Pfft,任何公司都可以声称它是健康的...

需要在发布之前确认对ExtraInformation的任何更改。假设公司在注册并且信息得到确认时并不富裕。后来该公司想标志自己富有。此时需要确认/公开版本ExtraInformation以及需要确认的未确认版本。

我希望能够保持那些方便OneToOneField反向关系调用,但也有相同数据的另一个版本。问题是,当然,OneToOneField中只能有一行引用这家公司。

目前我的解决方案是创建一个新表:

class ExtraInforationUnconfirmed(models.Model): 
    company = models.OneToOneField(Company) 
    wealthy = models.BooleanField() 

一旦消息得到证实,该领域被复制从ExtraInforationUnconfirmedExtraInformation。这种解决方案不是非常干燥或干净。

什么是解决此问题的最佳方法?

我研究了代理模型和模型继承。我能想到的最佳替代方式是拥有一个基础模型并继承两个模型,它们都有自己的OneToOneField关系到Company

回答

1

添加一个布尔费尔德的模型,并证实,当它更改为true:

class ExtraInforation(models.Model): 
    company = models.OneToOneField(Company) 
    wealthy = models.BooleanField() 
    confirmed = models.BooleanField(default=False) 

UPDATE
基于您的评论,我建议提交一个版本,它可以是一个简单的整数或日期时间。我会避免不惜任何代价:)

class ExtraInforation(models.Model): 
    company = models.ForeignKey(Company, related_name='extrainformations') 
    wealthy = models.BooleanField() 
    # version = models.PositiveIntegerField() 
    version = models.DateTimeField(auto_now_add=True) 
    confirmed = models.BooleanField(default=False) 

您可以将属性添加到Company返回最后extrainformation使company.extrainformation仍然可以工作,建立两个模型:

@property 
def extrainformation(self): 
    return self.extrainformations.order_by("-version").first() 
+0

好抱歉,我未能一一列出一个基本要求:两个版本必须能够同时存在。首先,公司可能并不富裕,而且信息得到确认。后来,公司决定它很富有。然后需要公开显示的确认版本以及需要确认的未确认版本。 – Mikuz

+0

公司的财产,就是这样!谢谢。我知道我没有想到一些简单的解决方案。实际上,我需要属性'extrainformation'(确认版本)和'extrainformationunconfirmed',以便我的方案按照我希望的方式工作。我将使用“确认”布尔值在两者之间进行选择。 – Mikuz

+0

这个解决小麻烦:小幅的'company.extrainformation'改变用途。由于它的属性,它总是被定义的。我不必检查'extrainformation'是否是'undefined',而是检查'None'。 – Mikuz

相关问题