根据名称过滤django QuerySet的最佳方式(等级)

所以我用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]

但我只是想知道是否有一个更好的,更简单的方法来做到这一点(因为列表理解给了我一个列表食谱,而不是一个QuerySet - >所以我失去了,例如我以前的'等级'信息) 。

谢谢!


你的过滤器有错误,如果你想在你的领域使用额外的条件,你必须做双下划线__

search_recipes.filter(rank__gt=0)

链接地址: http://www.djcxy.com/p/6593.html

上一篇: Best way to filter a django QuerySet based on value without name (rank)

下一篇: Django reverse to contains/icontains