2016-01-27 54 views
1

在我的Django(1.6+)應用程序中,我有許多指向(只讀)數據庫視圖的Django模型。 這些模型還包含外鍵關係。 現在如果Django應用程序試圖刪除相關的fk-models,如果我沒有設置所有外鍵字段上的cascade = DO_NOTHING,將導致數據庫錯誤(「無法從視圖中刪除」)。爲DB視圖相關模型創建基礎Django模型類,將所有ForeignKey字段設置爲on_delete = DO_NOTHING

例子:

class PersonView(models.Model): 
    person = models.ForeignKey(Person, db_column='fk_person', on_delete=DO_NOTHING) 

    class Meta: 
     db_table = 'view_persons' 
     managed = False 

由於我所有的DB-視圖模型ForeignKey的字段應該具有級聯=默認DO_NOTHING,我想創建一個將自動設置爲DB-視圖模型基類所有的外鍵字段on_delete = DO_NOTHING,所以我只需要關心從這個模型繼承 - 否則很容易忘記(和冗餘)爲所有字段設置此屬性。 在我想用這樣的代碼來最終結束:

class ViewModel(models.Model): 
    class Meta: 
     abstract = True 

    def __init__(self, *args, **kwargs): 
     super(ViewModel, self).__init__(*args, **kwargs) 
     # How to set all foreign-key fields' on_delete attribute to "DO_NOTHING"? 

class PersonView(ViewModel): 
    # no need to set on_delete anymore 
    person = models.ForeignKey(Person, db_column='fk_person') 

    class Meta: 
     db_table = 'view_persons' 
     managed = False 

我怎樣才能改變我的基類來設置所有的外鍵字段on_delete = DO_NOTHING的Django模型的屬性?

回答

1

那麼,你可以猴子補丁models.ForeignKey但更優選的方法是簡單地繼承ForeignKey

class MyForeignKey(models.ForeignKey): 
    def __init__(self, *args, **kwargs): 
     super(MyForeignKey, self).__init__(*args, **kwargs) 
     self.on_delete = models.DO_NOTHING 

然後你可以使用MyForeignKey,而不是ForeignKey在你的模型。

+0

我更喜歡更通用的方式,我可以只擴展(抽象)基本模型類,所以我不必小心不使用ForeignKey而不是MyForeignKey。 – ifischer

相關問題