0

有時ForeignKey字段需要默認值。例如:處理函數django模型字段默認值的最佳方法是什麼?

class ReleaseManager(BaseManager): 

    def default(self): 
     return self.filter(default=True).order_by('-modified').first() 


class Release(BaseModel): 
    default = models.BooleanField(default=False) 
    ... 


class Server(models.Model): 
    ... 
    release = models.ForeignKey(Release, null=True, default=Release.objects.default) 

一切都很好,與上面的代碼好,直到時機成熟的數據庫遷移於是功能默認情況下會導致很大的問題,因爲默認的功能不能被序列化。手動遷移可以解決這個問題,但是在一個大型項目中,定期遷移可能是squashed,這會給不知情的人留下一個定時炸彈。

一個常見的解決方法是將默認值從字段移動到模型的保存方法,但如果模型由rest framework之類的東西使用或者在字段中創建期望默認值的表單時會導致混淆。

回答

0

我目前最喜歡的解決方法適用於遷移和其餘的框架和其他表單生成。它假定對象管理器提供一個默認的方法,並使用一個專門的ForeignKey的領域得到它:

class ForeignKeyWithObjectManagerDefault(models.ForeignKey): 

    def __init__(self, to, **kwargs): 
     super().__init__(to, **kwargs) 
     self.to = to 

    def get_default(self): 
     return self.to.objects.default().pk 


class Project(SOSAdminObject): 
    primary = ForeignKeyWithObjectManagerDefault(Primary, related_name='projects') 
    ... 

現在遷移按預期工作,我們可以使用任何功能,我們希望提供一個默認的對象爲外鍵字段。

相關問題