python - 如何检测用户是否再次尝试投票?

标签 python flask peewee

我目前正在实现一个投票系统(应用程序中不会使用否决系统)。我设法在我的应用程序中为 Post 模型创建了一个 upvote 属性。该属性的默认值为 0,如下所示:

模型.py

class User(UserMixin, Model):
    username = CharField(unique= True)
    email = CharField(unique= True)
    password = CharField(max_length = 100)
    joined_at = DateTimeField(default = datetime.datetime.now)
    is_admin = BooleanField(default = False)
    confirmed = BooleanField(default = False)
    confirmed_on = DateTimeField(null=True)

    class Meta:
        database = DATABASE
        order_by = ('-joined_at',)

    def get_posts(self):
        return Post.select().where(Post.user == self)

    def get_stream(self):
        return Post.select().where(
            (Post.user == self)
        )

    @classmethod
    def create_user(cls, username, email, password, is_admin= False, confirmed = False, confirmed_on = None):
        try:
            with DATABASE.transaction():
                cls.create(
                username = username,
                email = email,
                password = generate_password_hash(password),
                is_admin = is_admin,
                confirmed = confirmed,
                confirmed_on = confirmed_on)
        except IntegrityError:
            raise ValueError("User already exists")

class Post(Model):
    timestamp = DateTimeField(default=datetime.datetime.now)
    user = ForeignKeyField(
        rel_model = User,
        related_name = 'posts'
    )
    name = TextField()
    content = TextField()
    upvotes = IntegerField(default=0)
    url = TextField()
    category = TextField()

    class Meta:
        database = DATABASE
        order_by = ('-timestamp',)

我设法通过让用户点击链接来增加值(value):

stream.html

 <div class="voting_bar">
        <a href="/vote/{{post.id}}"><img src="/static/img/upvote.png"></a>
        <p>{{post.upvotes}}</p>
      </div>

这将激活具有关联路由的功能:

app.py

@app.route('/vote/<int:post_id>')
def upvote(post_id):
    posts = models.Post.select().where(models.Post.id == post_id)
    if posts.count() == 0:
        abort(404)
    post = models.Post.select().where(models.Post.id == post_id).get()
    query = models.Post.update(upvotes = (post.upvotes+1)).where(models.Post.id == post_id)
    query.execute()
    return redirect(url_for('index'))

我的问题是,如何检测用户是否已经投票?我不确定我应该怎么做才能做到这一点。我的计划是,如果我确定用户是否试图再次投票,我会做的只是减少他们之前的投票。

最佳答案

我认为这里最好的方法是创建一个名为 Votes 的单独表,该表将包含两列。一个将存储帖子的 ID,另一个将存储用户的 ID。表中的每个条目或行都算作一票。如果用户尝试对特定帖子投票,您将首先查询 Votes 表是否存在具有该用户 ID 的行。如果不存在,则添加投票。但是,如果它确实存在,那么您只需删除投票即可。要获得特定帖子的总票数,您将再次查询 Votes 表并计算具有给定帖子 ID 的行数。这也将使您的应用程序具有可扩展性,以防万一您希望在将来添加反对票功能。

关于python - 如何检测用户是否再次尝试投票?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30473647/

相关文章:

javascript - 用于删除行尾空格模式的正则表达式

python - Python 中反对角线的滚动平均值

javascript - 如何使用 d3 加载两次相同的更新 csv

python - 运算符可以作为 python 中的类方法重载吗?

python 导入 MySQLdb

python - 如何使用坐标通过辛普森规则计算多边形的面积?

python - 如何将值从模板传递到 flask

python - Flask登录成功返回路由:/NONE

mysql - 比较peewee sql Python中的日期时间

python - Peewee Model 关键字不能是更新上的表达式