Web2Py DAL - 如何检查list:string类型项是否为None

1 投票
1 回答
1215 浏览
提问于 2025-04-18 04:45

我正在尝试查询一个数据集,想要返回所有不为空的列表字符串项。

我的示例表格:

db.define_table('newItems',
            Field('name', 'string'),
            Field('tasks', 'list:string'))

像这样查询空值:

for item in db(db.newItems.tasks != None).select(db.newItems.tasks):

返回结果:

[]
[]
[u'Wash Dog', u'Mow Yard']
[]
[u'Do X', u'Then do Y']
[]

我该如何构建查询,以便只返回:

[u'Wash Dog', u'Mow Yard']
[u'Do X', u'Then do Y']

谢谢你

更新:

这个答案在sqlite上测试有效,但在mongodb上却不行。空列表 [] 被当作 '' 处理,导致结果不正确:

In [4]: db.Tasks.email != []
Out[4]: <Query {'email': {'$ne': ''}}>

mongo shell:

> db.Tasks.find().count()
1195 (total records)

> db.Tasks.find({'email': {'$ne': ''}}).count()
1195

正确的查询应该是:

> db.Tasks.find({email: {$ne: [ ] }}).count()
108

这是mongo dal的一个bug吗,还是我可以用其他方式来指定空列表?

1 个回答

1

如果你通过 SQLFORM 输入记录,空的 task 值会被存储为空列表,而不是 None。所以你可以这样做:

db(db.newItems.tasks != []).select(db.newItems.tasks)

需要注意的是,这样做也会排除那些 task 值为 None 的记录(这些记录可能是因为你用 .insert() 插入时没有提供 task 值而存在的)。

更新:看起来由于 MongoDB 适配器的一个错误,上面的做法在 MongoDB 中不适用。

撰写回答