Django-删除对象而不删除其相关对象
我有两种型号:Django-删除对象而不删除其相关对象,django,django-models,Django,Django Models,我有两种型号: class Client(models.Model): some_field = models.CharField() class Ticket(models.Model): client = models.ForeignKey(Client) Tickets在我的系统中永远是的,但我希望用户能够删除他们不再需要的客户端。当前,它将删除客户端创建的所有票据 这是一个坏主意(从架构上讲),我应该把它们标记为不需要还是什么 如果这不是个坏主意,在保持干燥的情况下,
class Client(models.Model):
some_field = models.CharField()
class Ticket(models.Model):
client = models.ForeignKey(Client)
Ticket
s在我的系统中永远是的,但我希望用户能够删除他们不再需要的客户端。当前,它将删除客户端创建的所有票据
这是一个坏主意(从架构上讲),我应该把它们标记为不需要还是什么
如果这不是个坏主意,在保持干燥的情况下,最好的方法是什么。我不想为每个这样做的模型重写delete()
,但如果必须,我会重写(如果这是唯一的方法,那么最好的方法是什么)
就个人而言,我认为这是个坏主意(你会有孤儿票记录)。我只会将这些客户标记为“不需要”或“已删除”。您还可以在以后“取消删除”这些客户端。django.contrib.auth
模块必须在用户
模型中处理相同的问题。他们的解决办法是:
class User(models.Model):
# ...
is_active = models.BooleanField(default=True)
# ...
因此,“删除”一个用户
只是将设置为激活状态
为False
。与用户
s一起工作的所有内容都需要检查是否处于活动状态
作为记录,我认为在这种情况下删除客户端
s是一个坏主意
但是为了论证,如果您删除一个客户机
,那么它的相关票证
首先需要变成无客户机。将票据的型号更改为:
class Ticket(models.Model):
client = models.ForeignKey(Client, null=True, blank=True,
related_name='tickets')
然后,要删除客户端
,请执行以下操作:
for ticket in clientToDelete.tickets:
ticket.client = None
ticket.save()
clientToDelete.delete()
您可以将此代码放入Client
的delete
方法中,但如果您对Client
s进行大规模(即基于查询集)删除,则会跳过此代码。因此此问题非常古老,但万一有人遇到它(像我一样):从Django 1.3开始,如前所述,您可以对ForeignKey
型号使用on\u delete
参数。是的,1.2是我回答时的版本。