在我的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?
答案 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
。