【问题标题】:How to filter with "contains"?如何用“包含”过滤?
【发布时间】:2012-02-06 01:32:39
【问题描述】:

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

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

最后两个不应该在这里。但由于他们的 tree_path 包含“1” 过滤器也会带来这些。

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

【问题讨论】:

    标签: python regex django


    【解决方案1】:

    为什么不这样做

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

    【讨论】:

    • COMMENT_PATH_DIGITS = len('0000000000') - len(str(baseT.comment_ptr_id)) 对吗?如果是这样,为什么不:'0' * COMMENT_PATH_DIGITS + str(baseT.comment_ptr_id) 我不明白你为什么要弄乱模板。
    • 嗯,我认为重点是使用 COMMENT_PATH_DIGITS 而不是 len(),否则在灵活性方面不会比原来的有所提高。话虽如此,是的,你可以这样做 ('0' * (COMMENT_PATH_DIGITS - len(str(baseT.comment_ptr_id)))) + str(baseT.comment_ptr_id) 但恕我直言,这更麻烦。
    【解决方案2】:

    正则表达式是'(^|/)0*%d(/|$)' % baseT.comment_ptr_id,你可以将它与tree_path__regex一起使用

    阅读 MPTT 以了解此方法的替代方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-22
      • 2020-06-22
      • 2018-11-19
      • 1970-01-01
      • 2017-08-02
      • 2017-08-15
      • 2011-01-01
      • 1970-01-01
      相关资源
      最近更新 更多