将 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()
我想拥有同一模型的两个版本,同时仍然受益于 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
.
在模型中添加一个布尔字段,并在确认后将其更改为 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()