8

使用 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(以及如何全部替换它们)。

谢谢!

4

1 回答 1

15

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

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

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

传入列表 toadd_to_set将自动将其转换为$addToSetwith $each

于 2013-05-20T07:57:21.243 回答