簡體   English   中英

為數據庫視圖相關的模型創建基本的Django模型類,並將所有ForeignKey字段設置為on_delete = DO_NOTHING

[英]Create base Django model class for DB-view related models setting all ForeignKey-fields to on_delete=DO_NOTHING

在我的Django(1.6+)應用程序中,我有許多Django模型指向(只讀)數據庫視圖。 這些模型還包含外鍵關系。 現在,如果Django應用程序嘗試刪除相關的fk模型,那么如果我未在所有外鍵字段上設置cascade = 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-view-model-ForeignKey-fields都應具有cascade = DO_NOTHING,因此我想創建一個DB-View模型基類,該基類將自動將所有外鍵字段設置為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

如何更改基類中的Django模型屬性,以將所有外鍵字段設置為on_delete = DO_NOTHING?

好了,您可以使用猴子補丁模型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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM