2015-02-06 136 views
-2

我正在做一个社交网络应用程序,用户可以在其中发布和“喜欢”他们。我现在喜欢的系统的工作原理是这样的:Django喜欢系统建议?

  • 每一个岗位有models.CharField称为user_vote西港岛线65596
  • 一个MAX_LENGTH当用户按下“喜欢”按钮(如果后WASN”牛逼喜欢以前的),他们的USER_ID将被添加到user_vote(字符串追加)是这样的:

    story.user_vote += str(current_user) + ' ' 
    
  • 系统检查,如果用户ID已经在岗的user_vote通过拆分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() 
    

系统工作正常,但我认为这是不那么精心设计的。 你们有什么建议吗?

回答

2

嗯。我认为Like模型FKS到StoryUser将是清爽的设计:

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) 

UPDATE

class Story(models.Model): 
    ... 
    liked_by = models.ManyToManyField(User, blank=True) 

此选项有优点一样:作为备选方案,您可以在Story模型中使用M2M领域Like模型。

唯一的是缺少类似的附加信息。它可以通过through属性完成,但您的代码将与Like模型完全一样:-)

+0

谢谢。我正在尝试。但是,如何将其注册到admin.py? – ArchManiac 2015-02-06 01:44:54

+0

现在就做。非常感谢。 – ArchManiac 2015-02-06 01:49:39

+0

@ArchManiac你可以编辑'Like'模型作为'Story'的内联管理员:https://docs.djangoproject.com/en/1.7/ref/contrib/admin/#inlinemodeladmin-objects – catavaran 2015-02-06 01:51:18