如何在不引发错误的情况下更新数据库中的不喜欢投票?

Posted

技术标签:

【中文标题】如何在不引发错误的情况下更新数据库中的不喜欢投票?【英文标题】:How do I update like dislike vote in database without throwing an error? 【发布时间】:2022-01-16 04:21:39 【问题描述】:

我正在使用 MongoDB 制作在线商业术语词典。我想让对条款进行上下投票成为可能。我开始掌握 CRUD,但我对更新部分记录的语法有点困惑。

我有这个模板:

    <div class="col s-12 m-9 l10 text-center cyan-text text-darken-3 dict-cta">
        <a href="url_for('like', entry_id=entry._id)">
        <i class="far fa-thumbs-up"></i></a>
    </div>

逻辑是,当点击“like”时,代码应该从字典中提取"love_percent",转换为整数(如果不存在则提供值为零),加1,转换为字符串并在同一个@内更新987654330@。这是我为该路线编写的代码:


    @app.route("/like/<entry_id>")
    def like(entry_id):
        entry = mongo.db.jargon.find_one("_id": ObjectId(entry_id))
        value = int(entry["love_percent"][0])
        value += 1
        value = str(value)
        entry.update_one("_id": ObjectId(entry_id),
            "$set": 
                love_percent[0]: value
            )
        return render_template("jargon.html") 

我尝试只使用更新或存储整数,但这似乎可以解决问题。一个朋友建议update_one,但我基本上有点迷茫和迷茫。

谁能建议我在这里缺少什么或更好的方法?

(我知道这不会阻止同一用户进行多次投票;该功能可能会在以后出现。)

字典正在 Heroku 上演,我已经解决了这个错误:http://jargon-unchained.herokuapp.com/get_jargon

我在 Traceback 上收到以下错误: AttributeError: 'dict' 对象没有属性 'update_one'

此代码的存储库位于 Github:https://github.com/dandavies23/jargon-unchained

【问题讨论】:

欢迎回到 Stack Overflow。作为复习,请阅读How to Ask 和meta.***.com/questions/284236 和***.com/help/minimal-reproducible-example;并确保您show complete error messages。我们只能帮助您解决我们实际看到的错误。 请记住,这不是论坛,并注意edits I have made to your post 以保持严格的问答风格。这并不能完全修复帖子;我无法为您解释运行代码时出了什么问题(因为到目前为止只有您知道),而且我不确定您使用什么库来实现 Web 服务器(Django?Flask?其他?您应该告诉我们;也不清楚为什么您似乎认为问题与 MongoDB 有关)。 谢谢@KarlKnechtel 感谢您的反馈和指导。我会看看你的答案,阅读指南然后回来。在应用您的答案之前,我可以回答您提出的一些直接问题。我正在使用烧瓶。我确定这不是 MongoDB 的问题,而是我的代码表达方式。 【参考方案1】:

根据我对问题的理解。

您需要更改以下内容:

    因为你现在只有一个选项
value = int(entry["love_percent"])
    您正在更改数据库,因此请使用以下命令。
mongo.db.jargon.update_one("_id": ObjectId(entry_id),
            "$set": 
                "love_percent" : value
            )

请尝试说出 cmets 中面临的问题。

【讨论】:

谢谢。我在 Traceback 中收到的错误消息是 NameError: name 'love_percent' is not defined 你能检查一次吗? @dandavies23 你的架构是什么。你能分享一份文件吗? 感谢我删除了 [0] 的建议,如果不存在任何值,我认为它会返回 0。这行得通,但在模板构建中引发了另一个错误,这让我感到困惑。请参阅下面的答案,感谢您抽出宝贵时间查看。 我的代码工作正常吗?如果是,请点赞并将其标记为正确答案以供将来参考。【参考方案2】:

删除了我认为不是位置而是默认整数的 [0]。解决了在数据输入中为每个条目提供默认值 55 的问题。

我还使用未在函数中定义的术语重新渲染模板。通过重定向修复。

def like(entry_id):
    entry = mongo.db.jargon.find_one("_id": ObjectId(entry_id))
    value = int(entry["love_percent"])
    value += 1
    value = str(value)
    mongo.db.jargon.update_one("_id": ObjectId(entry_id),
        "$set": 
            "love_percent": value
        )
    return redirect(url_for("get_jargon"))

【讨论】:

以上是关于如何在不引发错误的情况下更新数据库中的不喜欢投票?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不引发错误的情况下检查模块的存在?

如何在不覆盖当前数据的情况下更新 Mongoose 中的混合类型字段?

如何在没有注册的情况下让喜欢更新?

如何在不使用字符串名称的情况下引发 PropertyChanged 事件

在不使用帐户的情况下设计 Django 投票系统

如何在不刷新整个页面的情况下更新 HTML 文档中的 php 变量?