Как отфильтровать с помощью «содержит»? - PullRequest
3 голосов
/ 09 января 2012

Я пытаюсь отфильтровать и получить некоторый набор объектов, используя этот сегмент.

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 ]

3 голосов
/ 09 января 2012

Почему бы не сделать

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))
2 голосов
/ 09 января 2012

регулярное выражение будет '(^|/)0*%d(/|$)' % baseT.comment_ptr_id, и вы используете его с tree_path__regex

прочитайте о MPTT для альтернатив этому подходу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...