![](/img/trans.png)
[英]How to use on_delete CASCADE for some objects and ondelete DO_NOTHING for others in djando models
[英]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.