2010-10-02 11 views
6

Я все больше осознаю, что я все еще Django noob, я не могу понять, что происходит с моей моделью данных и почему это не каскадное удаление. Вот моя модель.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 потока, который представляет собой случайно сгенерированную строку. Так что, когда я удаляю, я получаю начальный идентификатор потока (django auto-generated id), а затем использую его для захвата уникального идентификатора потока и удаления всех записей, содержащих этот идентификатор потока. Однако, когда я удаляю поток, он не автокаскадирует и не удаляет связанные объекты сообщений.

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

ответ

4

В 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

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

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

Смежные вопросы