Модель Django для системы голосования и отслеживания - PullRequest
0 голосов
/ 13 января 2019

Я работаю над системой голосования (голосование вверх и голосование вниз), а функциональность - следуйте. Я хочу, чтобы это было сделано хорошо, потому что мне некому посоветовать, я разместил здесь пост и код.

Функция Follow - должна показывать, сколько подписчиков и кто они. Я использовал здесь отношение m2m с промежуточной моделью Follower. Мой вопрос - это правильный подход к теме - использование m2m с промежуточной моделью здесь?

Функциональность: голосование "за" и "за" - предполагается, чтобы показать, сколько голосов "за" и "сколько" и "кто" проголосовал "против", а "кто" проголосовал "против". У меня вопрос, есть ли здесь также ОК с отношением между m2m и промежуточной моделью Voter?

Код для следующей функции:

class Post(models.Model):
    owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='posts')
    title = models.CharField(max_length=255, unique=True)
    description = models.TextField(max_length=1024)
    followers = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Follower', blank=True)
    is_visible = models.BooleanField(default=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('posts:post_detail', kwargs={'pk': self.pk})

    def number_of_followers(self):
        return self.followers.count()


class Follower(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.user

Код для функции голосования вверх и вниз:

class Question(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    vote_up = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Voter', blank=True)
    vote_down = models.ManyToManyField(settings.AUTH_USER_MODEL, through='Voter', blank=True)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('qa:qa_detail', kwargs={'pk': self.id})

class Voter(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.user

Сейчас работает только функция отслеживания, но я хочу убедиться, что мой подход в порядке. Пожалуйста и спасибо за вашу помощь.

1 Ответ

0 голосов
/ 13 января 2019

В настоящее время нет ничего, что отличало бы up_vote от down_vote в модели Вопросов, поэтому он будет возвращать тот же запрос.

В качестве дополнительного примечания, если вы планируете добавить аналогичные функции голосования / подписки к другим моделям, возможно, стоит подумать, является ли это хорошим вариантом использования для родовых отношений. Это создаст полиморфные отношения и будет СУХИМ.

Вот документы родовые отношения

...