2012-07-03 7 views
2

Я использую приложение django-threadedcomments, а так как в приведенной ниже модели parent является внешним ключом многопоточного комментария, он также удаляется, когда я удаляю комментарий. Однако я не хочу, чтобы это произошло. Поэтому я добавляю on_delete = models.SET_NULL, но это, похоже, не работает. Родительский комментарий по-прежнему удаляется, когда я удаляю комментарий.django on_delete не работает

Вот часть резьбовых комментариев модели, остальные все только методы, так что я пропустил их

class ThreadedComment(Comment): 
    title = models.TextField(_('Title'), blank=True) 
    parent = models.ForeignKey('self', null=True, blank=True, default=None, 
     related_name='children', verbose_name=_('Parent'), on_delete=models.SET_NULL) 
    last_child = models.ForeignKey('self', null=True, blank=True, 
     verbose_name=_('Last child')) 
    tree_path = models.TextField(_('Tree path'), editable=False, 
     db_index=True) 

    objects = CommentManager() 

Есть что-нибудь, что я делаю неправильно?

+0

Какой двигатель базы данных вы используете? У вас есть, например, 'ON DELETE CASCADE' установлен в вашей БД? –

+0

Какую версию Django вы используете? Каскадное поведение изменилось только в 1.3 (https://docs.djangoproject.com/en/dev/releases/1.3/#configurable-delete-cascade) –

+0

Я использую Django 1.3 и MySQL. При удалении каскада задается значение db – Sachin

ответ

1

Резьбовые комментарии являются примером учебника DELETE CASCADE. У вас иерархическая структура, поэтому, если родительский комментарий удален, все дети также должны быть удалены. В противном случае они становятся сиротами и ваша иерархия нарушается. В частности, с комментариями вы не можете просто назначить дочерний комментарий новому родительскому элементу, потому что они часто являются контекстуальными и не имеют смысла из контекста из комментария, на который был отправлен ответ.

Если вы посмотрите разделы комментариев на веб-сайтах через Интернет. Когда комментариев нахлынуто и комментаторы могут удалить свои комментарии (на самом деле большинство сайтов не позволяют вам удалять свои комментарии), они никогда фактически удалить комментарий. Вместо этого содержимое просто заменено на что-то вроде «Этот комментарий удален». Таким образом, контент технически ушел, удовлетворяя либо пользователя, либо модератора, , но он все еще висит вокруг ради иерархии.

+0

. Я понимаю, что вы говорите, после удаления комментария все его дети также должны быть удалены. Но то, что я хочу сделать, это то, что комментарий удаляется, а не удалять родительский элемент комментария. Вот почему я хотел установить 'on_delete = models.SET_NULL' для родительского внешнего ключа. Не имеет смысла удалять родительский комментарий, удаляя комментарий. – Sachin

+1

Django этого не делает. DELETE CASCADE удаляет все, что имеет внешний ключ * к *, что удаляется, а не внешние ключи этого объекта. Если родитель удаляется, у вас есть некоторая ошибка в вашем коде где-то - это не DELETE CASCADE. –

+0

Я не знаю, почему я вижу это поведение, потому что я удалял дочерний комментарий, а родитель также удалялся. Я использую приложение threadedcomments, но, похоже, нет ошибки в том, что – Sachin

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