2015-02-06 186 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