用于投票系统并遵循功能的Django模型

时间:2019-01-13 13:13:32

标签: python django django-models model vote

我负责投票系统(投票和否决)和功能-请遵循。 我希望它能做得很好,因为我没有任何人可以提供建议,所以将帖子和代码放在这里。

关注功能-它应显示有多少关注者以及他们是谁。我在这里与中间模型Follower使用了m2m关系。 我的问题-这是解决该主题的正确方法-在此处使用带有中间模型的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 :(得分:0)

当前,在Question模型上没有什么可以区分up_vote和down_vote的,因此它将返回相同的查询。

作为旁注,如果您打算向其他模型添加类似的投票/跟随功能,则可能值得考虑一下这是否是通用关系的好用例。这将创建一个多态关系并且是DRY。

这是文档 generic relations