我已经在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)
答案 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)
)