我越来越意识到我仍然是一个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的所有条目。但是,当我删除该线程时,它不会自动级联并删除相关的消息对象。
奇怪的是它之前有效,但随后停止工作,我不太清楚为什么。 有什么想法吗?
答案 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)
...
答案 1 :(得分:1)
这不是级联删除的工作方式。由于thread
具有message
的外键,因此如果删除message
,则级联效果是删除所有关联的thread
。有关更多信息和示例,请参阅文档:
如果这是你想要的,你可以在相关消息上调用delete
。