2012-04-23 49 views

回答

10

昨天我正在尋找這個問題的答案,我想出了這個解決方案,這足以解決我的問題,但可以根據需要進行擴展。

假設你有一個餐廳和一個地方Django模型,刪除的餐廳只腳不沾地的表內該行正在建立一個「假」餐廳的模型是這樣的方式:

class FakeRestaurant(models.Model): 
    place_ptr = models.PositiveIntegerField(db_column="place_ptr_id", primary_key=True) 
    serves_hot_dogs = models.BooleanField() 
    serves_pizza = models.BooleanField() 

    class Meta: 
     app_label = Restaurant._meta.app_label 
     db_table = Restaurant._meta.db_table 
     managed = False 

現在,您可以從表中檢索對象,如果它沒有邊界的外部關係:

place = Place.objects.get(pk=1) 
restaurant = Restaurant.objects.get(pk=1) 
fake_restaurant = FakeRestaurant.objects.get(pk=1) 
fake_restaurant.delete() 

fake_restaurant和餐廳將不再存在,地點將保持不變。

乾杯, 達維德

+0

請注意Meta類中的「託管」選項設置爲True – 2012-07-13 07:10:15

+2

你是一個邪惡的天才! – leech 2012-07-13 21:38:20

+0

我的意思是,設置爲False。編輯沒有保留正確的縮進。 感謝:D – 2012-07-30 07:37:48

2

在Django中加入1.9參數keep_parents模型delete()功能,所以爲了不讓父母只要致電:

restaurant.delete(keep_parents=True) 

文檔:https://docs.djangoproject.com/en/1.10/ref/models/instances/#django.db.models.Model.delete

UPDATE:

A pparently,這個功能是不是在Django 1.9中正常工作,請參閱註釋。

+1

我剛剛試過這個,在1.9的實現中似乎存在一個錯誤。所有與父對象的關係都被刪除。這已在更高版本中修復https://code.djangoproject.com/ticket/27407 – byoungb 2017-04-06 20:32:50