2016-01-22 85 views
0

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

一旦消息得到證實,該領域被複制從ExtraInforationUnconfirmedExtraInformation。這種解決方案不是非常乾燥或乾淨。

什麼是解決此問題的最佳方法?

我研究了代理模型和模型繼承。我能想到的最佳替代方式是擁有一個基礎模型並繼承兩個模型,它們都有自己的OneToOneField關係到Company

回答

1

添加一個布爾費爾德的模型,並證實,當它更改爲true:

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

UPDATE
基於您的評論,我建議提交一個版本,它可以是一個簡單的整數或日期時間。我會避免不惜任何代價:)

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返回最後extrainformation使company.extrainformation仍然可以工作,建立兩個模型:

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

好抱歉,我未能一一列出一個基本要求:兩個版本必須能夠同時存在。首先,公司可能並不富裕,而且信息得到確認。後來,公司決定它很富有。然後需要公開顯示的確認版本以及需要確認的未確認版本。 – Mikuz

+0

公司的財產,就是這樣!謝謝。我知道我沒有想到一些簡單的解決方案。實際上,我需要屬性'extrainformation'(確認版本)和'extrainformationunconfirmed',以便我的方案按照我希望的方式工作。我將使用「確認」布爾值在兩者之間進行選擇。 – Mikuz

+0

這個解決小麻煩:小幅的'company.extrainformation'改變用途。由於它的屬性,它總是被定義的。我不必檢查'extrainformation'是否是'undefined',而是檢查'None'。 – Mikuz

相關問題