【问题标题】:Adding and updating ListField with Mongoengine使用 Mongoengine 添加和更新 ListField
【发布时间】:2013-05-19 21:41:24
【问题描述】:

使用 Mongoengine 并尝试形成标签云。我想为每个项目附加一个或多个标签。这里使用了类似标签的东西(在每个问题下方)。

在这里搜索和阅读许多帖子后,我仍然无法正确地向 ListField 添加新条目,或者如何替换它们。

class Item(Document):
    tags = ListField(StringField(max_length=300))

我正在尝试推送一个或多个新标签,方法是使用表单并收集发布的结果。在我的 views.py 中,我进行了以下检查:

if 'tags' in request.POST and request.POST['tags'] <> '':
   for Tag in request.POST.getlist('tags'):
       ItemData.update(push__tags__S__tags=Tag)

尝试推送时失败:

ValidationError (Profile:5185505b73ea128e878f4e82) (仅列出和 元组可以在列表字段中使用:['tags'])

显然我使用了错误的类型,但我不知道如何解决这个问题。 奇怪的是,由于某种原因,数据被附加到记录中......(发布“测试”并刷新浏览器)

“标签”:[“测试”,“测试”]}

谁能给我看一个小例子,如何处理发布的字符串(来自 HTML 表单)并将其正确推送到 ListField 中(以及如何全部替换它们)。

谢谢!

【问题讨论】:

    标签: mongoengine listfield


    【解决方案1】:

    您不需要位置运算符$,它等同于 mongoengine 中的__S__,因为您不会替换/更新列表中的位置。

    由于您可能不想重复标记,您应该使用$addToSet。您可以像这样在 mongoengine 中执行此操作:

    ItemData.update(add_to_set__tags=['tag1', 'tag2'])
    

    将列表传递给add_to_set 将自动将其转换为带有$each$addToSet

    【讨论】:

    • 谢谢罗斯。尽管如此,它仍然给我留下了 ValidationError (只有列表和元组)。从表单帖子中接收数据时,如何将正确的格式推送到其中?
    • 将帖子数据转换为列表或元组。
    • 即使你的例子也给了我验证错误。使用 x=request.POST.getlist('tags'),它也应该给出一个列表,同样的错误。在谷歌搜索了几个小时并尝试拆分等之后,我真的看不出原因。同时我从 0.8.0RC1 升级到 0.8.0RC4,但没有解决。任何加分将不胜感激!喜欢 Mongoengine,但学习曲线让我有点退缩:)
    • 阅读您的示例后找到了原因。我的列表最初是空的,所以它拒绝保存它(尽管据我了解,我提供了一个要附加的列表)。当我先保存单个标签,然后附加 add_to_set 时,它工作正常。谢谢指点!
    • @user2391564 已经有很多年了,但是无论如何我都会为其他偶然发现它的人写它,你有 tags = ListField(StringField(max_length=300)) add default=[] 因为它会否定对数组的检查,您将按预期添加它。
    猜你喜欢
    • 1970-01-01
    • 2020-12-20
    • 2014-10-04
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    相关资源
    最近更新 更多