2010-09-10 132 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