2012-01-09 61 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用它來替代這種方法。