2015-02-06 5 views
-2

Я делаю приложение для социальных сетей, в котором пользователи могут отправлять сообщения и «нравиться» им. Моя текущая система симпатия работает следующим образом:Предложения о настройке Django?

  • Каждый пост имеет models.CharField называется user_vote Виль max_length из 65596
  • Когда пользователь нажимает «как» кнопки (Если сообщение WASN» т любил раньше), их user_id будет добавлен user_vote (добавляемой строка), как это:

    story.user_vote += str(current_user) + ' ' 
    
  • система проверки, что если Идентификатор пользователя уже в user_vote Почты разделив user_vote строку в список и проверить, если идентификатор пользователя уже есть:

    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

Hm. Я думаю, что Like модели с FKS до Story и 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) 

UPDATE: Как альтернатива, вы можете использовать поле M2M в Story модели:

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

Этот вариант имеет то же преимущество, модель Like.

Единственная вещь - отсутствие дополнительной информации для подобных. Это можно сделать с помощью свойства through, но тогда код будет выглядеть точно так же, как с моделью Like :-)

+0

Спасибо. Я пытаюсь это сделать. Но как мне зарегистрироваться на admin.py? – ArchManiac

+0

Выполнение этого прямо сейчас. Огромное спасибо. – ArchManiac

+0

@ArchManiac вы можете отредактировать модель 'Like' как встроенный администратор' Story': https://docs.djangoproject.com/en/1.7/ref/contrib/admin/#inlinemodeladmin-objects – catavaran

Смежные вопросы