我想要同一模型的兩個版本,但仍然從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