如何用“包含”过滤?

时间:2012-01-09 14:11:33

标签: python regex django

我尝试使用此段过滤并获取一些对象。

baseSet = ThreadedComment.objects.filter(tree_path__contains = baseT.comment_ptr_id)

但它会带来一些不应该存在的对象。 例如,我的baseT.comment_ptr_id为1,它带来了带有这些tree_path的项目。

comment_ptr_id=1 treepath = 0000000001
comment_ptr_id=3 treepath = 0000000001/0000000003
comment_ptr_id=4 treepath = 0000000001/0000000003/0000000004
comment_ptr_id=8 treepath = 0000000001/0000000003/0000000004/0000000008
comment_ptr_id=10 treepath = 0000000006/0000000010
comment_ptr_id=11 treepath = 0000000011

最后2个不应该在这里。但是因为他们的tree_path包含“1” 过滤器带来了那些。

如何编写正则表达式来创建不带这些项的过滤器?

2 个答案:

答案 0 :(得分:3)

为什么不

baseSet = ThreadedComment.objects.filter(tree_path__contains = ('%010i' % int(baseT.comment_ptr_id)))

这样id = 1的搜索字符串将是“0000000001”并且不会是“0000000011”的子字符串?

编辑:根据以下评论,使用COMMENT_PATH_DIGITS可能更好。这有点麻烦,因为您使用格式设置格式标记。它看起来像这样:

tree_path__contains = ('%%0%ii' % COMMENT_PATH_DIGITS % int(baseT.comment_ptr_id))

答案 1 :(得分:2)

正则表达式为'(^|/)0*%d(/|$)' % baseT.comment_ptr_id,您将其与tree_path__regex

一起使用

阅读有关此方法替代品的MPTT。