2010-09-10 133 views
4

我有兩個型號:Django的 - 刪除對象,而不刪除其相關對象

class Client(models.Model): 
    some_field = models.CharField() 

class Ticket(models.Model): 
    client = models.ForeignKey(Client) 

Ticket在我的系統是FOREVER,但我希望用戶能夠刪除他們不希望客戶端了。目前它會刪除由Client創建的所有票據。

  1. 這是一個壞主意(從架構上講),我應該將它們標記爲not_needed或其他?
  2. 如果這不是一個壞主意,那麼幹什麼最好的方法呢?我不想爲每個模型重寫delete(),但是如果必須的話(如果這是唯一的方法,最好的方法是什麼)。

回答

9

所以這個問題很老,但萬一有人穿過它運行(像我一樣):從Django的1.3開始,您可以使用on_delete參數ForeignKey模型,描述here

+0

是的,當我回答時,1.2是釋放的方式。 – 2012-08-18 02:50:31

0

我個人認爲這是一個壞主意(你會得到孤兒票記錄)。我只會將這些客戶標記爲'not_needed'或'deleted'。您還可以獲得稍後「取消」刪除這些客戶端的額外好處。

5

django.contrib.auth模塊必須處理User模型中的相同問題。他們的解決方案是:

class User(models.Model): 
    # ... 
    is_active = models.BooleanField(default=True) 
    # ... 

因此,「刪除」一個User只是設置is_activeFalse。與User一起工作的所有內容都需要檢查is_active

備案,我認爲在這種情況下刪除Client s是壞主意

但爲了論證的緣故,如果刪除Client,則其相關的Ticket需要先變得無客戶端。更改模型Ticket到:

class Ticket(models.Model): 
    client = models.ForeignKey(Client, null=True, blank=True, 
     related_name='tickets') 

然後,刪除Client,做到:

for ticket in clientToDelete.tickets: 
    ticket.client = None 
    ticket.save() 
clientToDelete.delete() 

你可以把這個代碼放到Clientdelete方法,但它會被忽略,如果你做質量(即基於QuerySet的)刪除Client s。

+0

更好看http://stackoverflow.com/a/8543956/2978172 – 2016-05-18 03:53:13