为DB-view相关模型创建基本Django模型类,将所有ForeignKey字段设置为on_delete = DO_NOTHING

时间:2016-01-27 11:12:41

标签: django django-models

在我的Django(1.6+)应用程序中,我有许多指向(只读)数据库视图的Django模型。 这些模型还包含外键关系。 现在,如果Django应用程序试图删除相关的fk模型,如果我没有在所有外键字段上设置cascade = DO_NOTHING,则会导致DB错误(“无法从视图中删除”)。

示例:

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?

1 个答案:

答案 0 :(得分: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