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是我回答时的版本。