没有过开发经验的新手,拜托各位大神指点一下,我应该怎么改进下面我下面这种二级评论的设计?如果描述的不够详细,我再补充。
ps: 我的思路,就是一篇文章和一级评论形成一对多的关系,然后一级评论和二级评论又形成一对多的关系。
models.py
class BlogComment(models.Model): """这是一级评论""" user_name = models.CharField('Name', max_length=100) # 指定用户名 body = models.TextField('Content') # 评论的主体 # 将一级评论关联对应的文章 article = models.ForeignKey('Article', verbose_name='Article', on_delete=models.CASCADE) class SubComment(BlogComment): """这是二级评论,继承自一级评论,但是增加了一个parent_comment属性""" # 将二级评论关联对应的一级评论 parent_comment = models.ForeignKey('BlogComment', verbose_name='BlogComment', on_delete=models.CASCADE)
froms.py中指定评论的表单
class BlogCommentForm(forms.ModelForm): """一级评论的表单""" class Meta: model = BlogComment # 指定一级评论的model fields = ['user_name', 'body'] widgets = { 'user_name': forms.TextInput(attrs={ 'required': 'required', }), 'body': forms.Textarea(attrs={ 'required': 'required', }), } class SubCommentForm(BlogCommentForm): """二级评论的表单,继承自一级评论的表单""" class Meta: model = SubComment # 制定二级评论的model fields = copy.deepcopy(BlogCommentForm.Meta.fields) widgets = copy.deepcopy(BlogCommentForm.Meta.widgets)
views.py
class CommentPostView(FormView): """一级评论视图层""" form_class = BlogCommentForm template_name = 'blog/article.html' def form_valid(self, form): # 保存表单到数据库 comment = form.save(commit=False) comment.save() return HttpResponseRedirect('/') def form_invalid(self, form): # ... 一些提示用户表单输入不合理的信息 class SubCommentView(CommentPostView): """二级评论视图层,继承与一级评论视图层""" # 覆盖form_class成二级评论的表单 form_class = SubCommentForm
如果评论只有2级,大体思路没有问题。
但是你要想,你的二级评论,也是可以被评论的。所以有可能会有三级,四级。。评论。
这样你的设计就会有问题。
这其实是一个比较经典的问题了吧. 不过要是我去设计,我会根据树模型去设计.
谢邀
按照你的思路是没有问题的,一级评论是对博客的评论,二级评论其实是对某条博客评论的一个回复,不管回复的人是博主还是其他人都算是回复。
我觉得考虑二级就可以了,即使QQ空间的说说评论与回复也就两级,至于反复的回复只要展示谁回复谁,然后按时间排个序就可以了。具体就参考2楼的博客即可。
对于三级、四级的评论,个人觉得可以不考虑,只要理解评论都是针对博客的,回复则是针对评论的。嵌套的级数太多会很卡的。
更新于 2016-11-17 19:17
class Comment(models.Model):
"""评论"""
user = models.ForeignKey(User) # 评论用户
body = models.TextField() # 评论内容
article = models.ForeignKey(Article) # 博客
created_at = ... # 评论时间
class Reply(models.Model):
"""回复"""
comment = models.ForeignKey(Comment) # 评论
from_user = models.ForeignKey(User) # 回复用户
to_user = models.ForeignKey(User) # 被回复用户
body = models.TextField() # 回复内容
created_at = ... # 回复时间
我大概会这样设计数据库,一篇博客下面会有多个评论,每个评论下面有多个回复。
可以这样设计,没有问题,至于更深层级的评论只需要在二级评论表内加上评论人和被评论人的字段进行识别即可。我博客的评论大体就是这样做的。具体效果可以参考:https://www.rapospectre.com/b...。具体实现:https://github.com/bluedazzle...