我想要同一模型的两个版本,但仍然从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()
一旦消息得到证实,该领域被复制从ExtraInforationUnconfirmed
到ExtraInformation
。这种解决方案不是非常干燥或干净。
什么是解决此问题的最佳方法?
我研究了代理模型和模型继承。我能想到的最佳替代方式是拥有一个基础模型并继承两个模型,它们都有自己的OneToOneField关系到Company
。
好抱歉,我未能一一列出一个基本要求:两个版本必须能够同时存在。首先,公司可能并不富裕,而且信息得到确认。后来,公司决定它很富有。然后需要公开显示的确认版本以及需要确认的未确认版本。 – Mikuz
公司的财产,就是这样!谢谢。我知道我没有想到一些简单的解决方案。实际上,我需要属性'extrainformation'(确认版本)和'extrainformationunconfirmed',以便我的方案按照我希望的方式工作。我将使用“确认”布尔值在两者之间进行选择。 – Mikuz
这个解决小麻烦:小幅的'company.extrainformation'改变用途。由于它的属性,它总是被定义的。我不必检查'extrainformation'是否是'undefined',而是检查'None'。 – Mikuz