Django的 - 删除对象,而不删除其相关对象
问题描述:
我有两个型号:Django的 - 删除对象,而不删除其相关对象
class Client(models.Model):
some_field = models.CharField()
class Ticket(models.Model):
client = models.ForeignKey(Client)
Ticket
在我的系统是FOREVER,但我希望用户能够删除他们不希望客户端了。目前它会删除由Client
创建的所有票据。
- 这是一个坏主意(从架构上讲),我应该将它们标记为
not_needed
或其他? - 如果这不是一个坏主意,那么干什么最好的方法呢?我不想为每个模型重写
delete()
,但是如果必须的话(如果这是唯一的方法,最好的方法是什么)。
答
我个人认为这是一个坏主意(你会得到孤儿票记录)。我只会将这些客户标记为'not_needed'或'deleted'。您还可以获得稍后“取消”删除这些客户端的额外好处。
答
django.contrib.auth
模块必须处理User
模型中的相同问题。他们的解决方案是:
class User(models.Model):
# ...
is_active = models.BooleanField(default=True)
# ...
因此,“删除”一个User
只是设置is_active
到False
。与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()
你可以把这个代码放到Client
的delete
方法,但它会被忽略,如果你做质量(即基于QuerySet的)删除Client
s。
+0
更好看http://*.com/a/8543956/2978172 – 2016-05-18 03:53:13
是的,当我回答时,1.2是释放的方式。 – 2012-08-18 02:50:31