我正在做一个社交网络应用程序,用户可以在其中发帖并且喜欢'他们。我目前的喜好系统是这样的:
当用户按下'喜欢'按钮(如果帖子之前没有被喜欢过),他们的user_id将被添加到 user_vote (字符串追加),如下所示:
story.user_vote += str(current_user) + ' '
系统通过将 user_vote 字符串拆分为列表,检查用户的ID是否已在帖子的 user_vote 中检查用户的ID是否已经存在:
voted = str(current_user) in story.user_vote.split()
if story and voted == False:
points = story.points + 1
story.points = points # Add points
story.user_vote += str(current_user) + ' '
story.save()
系统工作正常,但我认为它的设计不是很好。 你们有什么建议吗?
答案 0 :(得分:2)
嗯。我认为使用FK到Like
和Story
的{{1}}模型将是更清晰的设计:
User
所以喜欢的代码就是:
class Like(models.Model):
story = models.ForeignKey(Story)
user = models.ForeignKey(User)
class Meta:
unique_together = ('story', 'user', )
在任何时候,您都可以获得用户喜欢的故事列表:
Like.objects.get_or_create(story=story, user=user)
story.points = story.like_set.all().count()
story.save()
或喜欢该故事的用户列表:
Story.objects.filter(like__user=user)
您甚至可以在User.objects.filter(like__story=story)
模型中获得其他信息。例如,用户喜欢故事的时间:
Like
更新:作为替代方案,您可以在from django.utils import timezone
class Like(models.Model):
...
liked_at = models.DateTimeField(default=timezone.now)
模型中使用M2M字段:
Story
此选项与class Story(models.Model):
...
liked_by = models.ManyToManyField(User, blank=True)
模型具有相同的优势。
唯一缺少的是其他信息。可以使用through属性来完成,但您的代码看起来与Like
模型完全相同: - )