如何在Django模型中建立喜欢/不喜欢机制

时间:2020-06-24 12:32:21

标签: django django-models

我已经在Django应用程序中实现了注释模型。现在,我想将其与CommentLike模型相关联,以跟踪用户的喜欢/不喜欢的反应。

我应该在CommentLike模型中保持喜欢还是不喜欢,还是应该有另一个模型CommentDislike

拥有喜欢/不喜欢的模型并将其保持在结构化方式中的最佳方法是什么?

class Comment(models.Model):
    uuid = models.UUIDField(max_length=255, default = uuid.uuid4)
    description = models.CharField(max_length=5000, default="")
    likes = models.PositiveIntegerField(default=0)
    uploaded_at = models.DateTimeField(null=True, blank=True)
    commentinguser = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)

    video = models.ForeignKey(Video, on_delete=models.CASCADE)

class CommentLike(models.Model):
    likinguser = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)

    comment = models.ForeignKey(Comment, on_delete=models.CASCADE)

2 个答案:

答案 0 :(得分:1)

您无需创建其他模型。您可能会遇到这样的事情:

class Comment(models.Model):
    # ...
    commentinguser = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT)
    video = models.ForeignKey(Video, on_delete=models.CASCADE)

class CommentFeedback(models.Model):
    FEEDBACK_OPTIONS = (
        ('L', 'Like'),
        ('D', 'Dislike'),
    )
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.PROTECT, related_name='feedback')
    type = models.CharField(max_length=1, choices=FEEDBACK_OPTIONS)
    comment = models.ForeignKey(Comment, on_delete=models.CASCADE, related_name='feedback')

然后,您可以通过写以下内容来访问所有喜欢的评论:

Comment.objects.filter(feedback='L') # To get the likes 

与获取用户活动相同:

User.objects.filter(feedback='L') # To get every comment that a user liked

通过这种方法,您还可以通过仅将其写入FEEDBACK_OPTIONS中来添加诸如stackoverflow拍手之类的信息或任何其他类型的反馈。

答案 1 :(得分:1)

数据库写入可能很繁重,读取应该很快。

无论如何,在Comment模型中将x[3] = '\0';计数并使用'F'查询来增加/减少计数器将解决您将来的大部分问题。那里的决定真好。

在另外一个likes列中有两个选择-CommentLike模型本身中的['like','dislike']和type约束。

因此,要获取ID = comment_id的评论的“评论喜欢者”的查询将是:

unique_together = ('likinguser', 'comment')

对于不喜欢的人,

User.objects.filter(
id__in=CommentLike.objects.filter(comment=comment_id, type='like').values_list('likinguser', flat=True)
)