如何在不引发错误的情况下更新数据库中的不喜欢投票?
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 中的混合类型字段?