将OneToOneField与多个版本的数据

时间:2016-01-22 07:47:09

标签: django django-orm

我想拥有相同型号的两个版本,同时仍然受益于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

1 个答案:

答案 0 :(得分:1)

在模型中添加一个布尔字段,并在确认时将其更改为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添加一个属性,该属性会返回最后一个额外信息,以便company.extrainformation仍然有效:

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