Django喜欢系统建议?

时间:2015-02-06 01:20:36

标签: django

我正在做一个社交网络应用程序,用户可以在其中发帖并且喜欢'他们。我目前的喜好系统是这样的:

  • 每个帖子都有 models.CharField ,名为 user_vote ,最大长度为65596
  • 当用户按下'喜欢'按钮(如果帖子之前没有被喜欢过),他们的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()
    

系统工作正常,但我认为它的设计不是很好。 你们有什么建议吗?

1 个答案:

答案 0 :(得分:2)

嗯。我认为使用FK到LikeStory的{​​{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模型完全相同: - )