Django - 删除对象而不删除其相关对象

oro*_*aki 5 django django-models

我有两个型号:

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

class Ticket(models.Model):
    client = models.ForeignKey(Client)
Run Code Online (Sandbox Code Playgroud)

Tickets 在我的系统中是永远的,但我希望用户能够删除他们不再需要的客户端.目前它将删除由该创建的所有票证Client.

  1. 这是一个坏主意(从架构上讲),我应该把它们标记为什么not_needed或者其他东西?
  2. 如果这不是一个坏主意,那么最好的方法是什么,同时保持DRY.我不想delete()为每个执行此操作的模型覆盖,但是如果必须的话(如果这是唯一的方法,那么最好的方法是什么).

Jon*_*nas 10

所以这个问题很老,但万一有人穿过它运行(像我一样):从Django的1.3开始,你可以使用on_delete参数ForeignKey模型,描述在这里.


Mik*_*one 5

该django.contrib.auth模块必须在User模型中处理同样的问题.他们的解决方案是:

class User(models.Model):
    # ...
    is_active = models.BooleanField(default=True)
    # ...
Run Code Online (Sandbox Code Playgroud)

所以"删除"a User只是设置is_active为False.与Users 兼容的所有东西都需要检查is_active.

为了记录,我认为Client在这种情况下删除s是一个坏主意.

但是为了争论,如果你删除a Client,那么它的相关Tickets需要首先变成无客户端.将模型更改为Ticket:

class Ticket(models.Model):
    client = models.ForeignKey(Client, null=True, blank=True, 
        related_name='tickets')
Run Code Online (Sandbox Code Playgroud)

然后,删除a Client,执行:

for ticket in clientToDelete.tickets:
    ticket.client = None
    ticket.save()
clientToDelete.delete()
Run Code Online (Sandbox Code Playgroud)

你可以把这个代码进入Client的delete方法,但是如果你做一团(即查询集为基础),删除它会得到跳过Client秒.