Django没有级联删除

时间:2010-10-02 20:59:19

标签: python sql django

我越来越意识到我仍然是一个Django noob,我似乎无法弄清楚我的数据模型发生了什么,以及为什么它没有级联删除。这是我的模特。

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 个答案:

答案 0 :(得分:5)

在Django 1.3版中,有一个on_delete参数可以确定“ondelete”动作,例如:

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/

答案 1 :(得分:1)

这不是级联删除的工作方式。由于thread具有message的外键,因此如果删除message,则级联效果是删除所有关联的thread。有关更多信息和示例,请参阅文档:

如果这是你想要的,你可以在相关消息上调用delete

相关问题