Django删除时未级联
我越来越意识到自己在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)
...