所以我用django构建了一个web应用程序,使用postgres作为数据库。使用django.contrib.postgres.search.SearchRank
,我用“巧克力”这个词在我的数据库中搜索所有食谱,它给了我一个很好的排序查询集。
from django.contrib.postgres.search import SearchVector, SearchQuery, SearchRank
# example code:
# searching recipe_name:
vector = SearchVector('recipe_name')
# searching for the term 'chocolate':
query = SearchQuery('chocolate')
# Recipe = recipes class in Models.py; contains 'recipe_name' column.
search_recipes = Recipe.objects.annotate(
rank=SearchRank(vector, query)
).order_by('-rank')
# this gives me a QuerySet of recipes, which have a rank attribute:
print(search_recipes[0].rank)
# 0.0607927
我不希望出现匹配分数为0的食谱,所以我想按分数('等级')进行过滤。通常我会通过例如:
来做到这一点search_recipes.filter(rank_gt=0)
但'rank'
是postgres特殊SearchRank
函数的一个附加属性,它不是列名或任何内容,因此会产生错误(`无法将关键字'rank_gt'解析为字段)。我可以通过以下方式得到我想要的东西:
x = [r for r in search_recipes if r.rank > 0]
但我只是想知道是否有一种更好,更少hacky的方式来做到这一点(因为列表理解给了我一个列表食谱,而不是一个QuerySet - >所以我输了例如我的'等级'信息我之前有过。)
谢谢!
答案 0 :(得分:1)
您的过滤器中有错误,如果您想在字段中使用其他条件,则必须使用双下划线__
search_recipes.filter(rank__gt=0)