Django删除时未级联

6 投票
2 回答
13834 浏览
提问于 2025-04-16 04:54

我越来越意识到自己在Django方面还是个新手,似乎搞不清楚我的数据模型出了什么问题,为什么删除操作没有连锁反应。这里是我的模型。

class message(models.Model):
     msg_text = models.CharField(max_length = 9900)
     date_time = models.DateTimeField()
     is_read = models.BooleanField(default=False)


 class thread(models.Model):
     message = models.ForeignKey(message)
     subject = models.CharField(max_length=160)
     from_user = models.ForeignKey(User, related_name = 'from_user')
     to_user = models.ForeignKey(User, related_name = 'to_user')
     thread_id = models.CharField(max_length = 36)

def __unicode__(self):
    return self.subject

接下来是我的删除函数。

def delete_message(request, thread_id):
     t = thread.objects.get(id=thread_id)
     thread.objects.filter(thread_id = t.thread_id).delete()

     return HttpResponseRedirect(reverse("inbox.views.index"))

每个线程都有相关的消息,而所有包含相关消息(比如回复)的线程都是通过一个线程ID连接在一起的,这个ID是随机生成的字符串。
所以当我删除一个线程时,我先获取这个线程的初始ID(Django自动生成的ID),然后用它来找到唯一的线程ID,并删除所有包含这个线程ID的记录。但是,当我删除线程时,相关的消息对象并没有自动被删除。

奇怪的是,这个功能之前是可以正常工作的,但后来就不行了,我也不太清楚为什么。
有没有什么想法?

2 个回答

1

这不是级联删除的工作方式。因为 thread(线程)有一个指向 message(消息)的外键,所以如果你删除了一条 message,那么所有与之关联的 thread 都会被自动删除。这方面的更多信息和例子可以查看文档:

如果你想删除某条消息,可以直接对关联的消息调用 delete

5

在Django 1.3版本中,有一个叫做on_delete的参数,它决定了在删除某个对象时应该采取什么样的行动。例如:

def get_sentinel_user():
    return User.objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
    user = models.ForeignKey(User, on_delete=models.SET(get_sentinel_user))

所以你可以试试:

class thread(models.Model):
     message = models.ForeignKey(message, on_delete=models.CASCADE)
     ...

来源 http://docs.djangoproject.com/en/1.3/ref/models/fields/

撰写回答