2012-01-09 29 views
3

我尝试过滤并获取一些使用此段的对象。如何用“contains”过滤?

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” 过滤器也会带来这些。

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

回答

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)) 
+0

+1,但在填充更改的情况下使用COMMENT_PATH_DIGITS。 – JamesO 2012-01-09 14:21:06

+0

'COMMENT_PATH_DIGITS = len('0000000000') - len(str(baseT.comment_ptr_id))'对不对?如果是这样,为什么不呢:''0'* COMMENT_PATH_DIGITS + str(baseT.comment_ptr_id)'我不明白为什么你必须弄乱模板。 – 2012-01-09 18:00:58

+0

嗯,我认为重点是使用COMMENT_PATH_DIGITS而不是len(<0的字符串>),否则灵活性不会增加。这样说,是的,你可以做(​​'0'*(COMMENT_PATH_DIGITS - len(str(baseT.comment_ptr_id))))+ str(baseT.comment_ptr_id),但恕我直言,这是混乱。 – 2012-01-10 03:11:11

2

正则表达式是'(^|/)0*%d(/|$)' % baseT.comment_ptr_id和你tree_path__regex

阅读有关MPTT用它来替代这种方法。