Django - Использование деревьев для построения системы комментариев - PullRequest
0 голосов
/ 22 декабря 2009

Несколько дней назад я возился с Джанго, пытаясь понять, как все это работает, когда я решил попробовать создать простой форум, похожий на форум, который я посещал (но сейчас закрытый) , Идея заключалась в том, что каждый из комментариев будет родительским для любого количества комментариев, например так:

 comment <--top
   comment <-- comment "A"
   comment <-- comment "B"
   comment <-- comment "C"
     comment <--C-1, reply to comment "C"
       comment <-- C-1-1, reply to comment "C-1"
         comment 
           comment 
             comment
         comment <-- C-1-1-1 reply to C-1-1
         comment 
         comment
           comment
             comment
     comment
     comment
       comment
         comment
           comment
             comment
             comment
             comment

Идея заключается в том, что ответы на комментарий будут помещаться под ним на один уровень, и у каждого комментария, за исключением самого первого комментария, будет родитель. Дело в том, что, хотя я и понимаю идею реализации обходов дерева, ни одна из книг / статей, которые я читал по этому вопросу, не учитывает Django (или модель MVC в этом отношении), поэтому мой вопрос заключается в том, как мне поступить внедряете эту систему в Django? (вот код модели, который я получил для справки: - /)

class Comment(models.Model): 
 Parent = models.OneToOneField('self', null=True)
 Children = models.ForeignKey('self', null=True)

 Author = models.ForeignKey(User)
        Author_IP = models.IPAddressField()
 Created_On = models.DateTimeField(auto_now_add=True)
 Modified_On = models.DateTimeField(auto_now=True)
 Body = models.TextField()

Ответы [ 2 ]

2 голосов
/ 22 декабря 2009

Взгляните на django-threadadedcomments . Его цель больше подходит для использования в качестве комментариев в блоге, чем для полнофункционального форума, но если он не подходит для вашего случая, вы можете, по крайней мере, взглянуть на исходный код и узнать несколько вещей из него.

Что касается древовидных структур, есть три проекта, которые мне известны для ORM в Django: django-mptt (этот проект имеет наибольшую долю рынка среди сторонних приложений django AFAIK ), django-treebeard и easytree (основано на древобороде). Easytree поставляется с хорошим интерфейсом администратора, но в двух других проектах есть по крайней мере патчи в трекерах, чтобы добавить интерфейс администратора (не уверен, что они уже интегрировали эти патчи).

1 голос
/ 22 декабря 2009

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

class Comment(models.Model):
  parent=models.ForeignKey('self', related_name="children", null=True, blank=True)
  #other fields 

Тогда вы могли бы получить его детей

comment=Comment.objects.get(id=1)
children=comment.children.all()

for child in children:
  morechildren=child.children.all()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...