将 OneToOneField 与多个版本的数据一起使用

Using OneToOneField with multiple versions of data

我想拥有同一模型的两个版本,同时仍然受益于 OneToOneField 的反向关系。

例如,假设我有以下型号:

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

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

在这一点上,我的代码利用了 OneToOneField 反向关系的卓越之处,在所有地方进行 company.extrainformation 调用。

然后我得到一个新的要求:我们不能不先验证 ExtraInformation 就相信它!噗,什么公司都可以说是有钱...

ExtraInformation 的任何更改都需要在发布前进行确认。假设公司在注册时并不富有,并且该信息得到确认。后来公司想标榜自己富有。那时需要 ExtraInformation 的 confirmed/public 版本和需要确认的未确认版本。

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

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

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

确认信息后,字段将从 ExtraInforationUnconfirmed 复制到 ExtraInformation。此解决方案不是很干燥或干净。

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

我研究了代理模型和模型继承。我能想到的最好的替代方法是拥有一个基本模型并继承两个模型,这两个模型都具有自己与 Company.

的 OneToOneField 关系

在模型中添加一个布尔字段,并在确认后将其更改为 true:

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

更新
根据您的评论,我建议提交一个版本,它可以是一个简单的整数或一个日期时间。我会不惜一切代价避免创建两个模型:)

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,即 returns 最后的额外信息,这样 company.extrainformation 仍然有效:

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