【发布时间】:2011-06-08 06:44:34
【问题描述】:
我在我的 django 网站上设置了标签,我想允许以下形式的 url:
http://example.com/search/tags/(foo+dog)|(goat+cat)
在英语中的意思是:
查找标记为 (foo AND dog) OR (goat AND cat) 的项目。
所以本质上我需要的是一种使用 Django API 将其缩减为查询的方法。目前我只想支持AND、OR和括号。
我想有一些库可以解释这种布尔值,但我无法在成熟的搜索引擎之外找到任何库。使用 Django API 是否有任何技巧或良好的起点?
目前,我的代码非常基本,但它支持 either OR 查询 或 AND 查询,但不支持它们的组合(因此也没有括号)。
编辑: 我相当确信,如果我可以将其分类为一系列 AND 和 OR 查询,我将一切就绪......但我无法思考如何从随机带括号的布尔查询到逻辑上有用理解查询。
这是我到目前为止的代码,以防万一有用。我没有使用标记模块(虽然也许我应该),代码仍然很草,但是...
@login_required
def view_opinions_by_tag(request, tagValues):
'''Displays opinions tagged by a user with certain tags.
Given a set of tags separated by pluses, pipes, and parentheses, unpack
the set of tags and display the correct opinions. Currently only supports
pluses (AND filters), and pipes (OR filters).
'''
if '|' in tagValues:
# it's an or query.
tagList = tagValues.split('|')
tags = Tag.objects.filter(tag__in = tagList, user = request.user)\
.values_list('pk', flat=True)
faves = Favorite.objects.filter(tags__in = list(tags), user = request.user).distinct()
elif '+' in tagValues:
# it's an and query - not very efficient.
tagList = tagValues.split('+')
tagObject = Tag.objects.get(tag = tagList[0], user = request.user)
faves = Favorite.objects.filter(tags = tagObject, user = request.user)
for tag in tagList[1:]:
tagObject = Tag.objects.filter(tag = tag, user = request.user)
faves = faves.filter(tags = tagObject, user = request.user).distinct()
else:
# it's a single tag
tag = Tag.objects.get(tag = tagValues, user = request.user)
faves = Favorite.objects.filter(tags = tag, user = request.user)
从这里开始,我基本上采用了 faves 查询集并渲染它。也许不是最有效的,但似乎到目前为止有效。
【问题讨论】:
标签: django tagging boolean-logic