Джанго не каскадно при удалении - PullRequest
6 голосов
/ 03 октября 2010

Я все больше и больше осознаю, что я все еще нуб Джанго, я не могу понять, что происходит с моей моделью данных и почему не происходит каскадное удаление.Вот моя модель.

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"))

Таким образом, к каждому потоку прикреплены сообщения, и все потоки, содержащие связанные сообщения (т.е. ответы), связаны сидентификатор потока, который является случайно сгенерированной строкой.Поэтому, когда я удаляю, я получаю исходный идентификатор потока (автоматически сгенерированный идентификатор django), а затем использую его, чтобы получить уникальный идентификатор потока и удалить все записи, содержащие этот идентификатор потока.Однако когда я удаляю поток, он не выполняет автоматическое каскадирование и не удаляет связанные объекты сообщений.

Странно то, что раньше это работало, но потом перестало работать, я не слишком уверен, почему.Есть идеи?

Ответы [ 2 ]

5 голосов
/ 03 февраля 2011

В 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)
     ...

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

1 голос
/ 03 октября 2010

Это не то, как работает каскадное удаление. Поскольку thread имеет внешний ключ для message, при удалении message каскадным эффектом является удаление всех связанных thread s. См. Документацию для получения дополнительной информации и примеров:

Вы можете позвонить delete в соответствующем сообщении, если вы этого хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...