实际上我有一个工作代码,但我面临的问题是如何根据多个规则对查询集的结果进行排序。这是我的 models.py :
class Node(MPTTModel):
parent = TreeForeignKey('self', on_delete=models.CASCADE, blank=True, null=True, related_name='children')
name = models.TextField(blank=True, null=True)`
viewed_by = models.ManyToManyField(CustomUser, related_name='viewed_by', blank=True)
bookmarked_by = models.ManyToManyField(CustomUser, related_name='bookmarked_by', blank=True)
thumbs_up = models.ManyToManyField(CustomUser, related_name='thumbs_up', blank=True)
在我的views.py中,我设法查询了数据库并根据所有匹配的单词显示了所有结果,但这里缺少的一点是我只设法按书签数量对结果进行排序。对于即:我有这两个对象:
Object 1 : name = How to use django forms ?
Object 2 : name = Using django forms for searching the database.
对象 1 被 20 个用户添加书签,对象 2 被 10 个用户添加书签,我在搜索栏中输入:使用 django 表单数据库 结果我有第一个对象作为列表中显示的第一个答案,即使第二个有与搜索的关键字匹配更多。所以我在这里要做的是首先根据匹配关键字的数量对结果进行排序,然后按书签数量对其进行排序。到目前为止,这是我的观点:
search_text_imported = request.session['import_search_text']
if search_text_imported != '':
result_list = []
get_result_list = [x for x in search_text_imported.split() if len(x) > 2]
for keyword in get_result_list:
tree_list = Node.objects.filter((Q(name__icontains=keyword) | Q(Tags__icontains=keyword)), tree_type='root', published=True ).annotate(num_bookmarks=Count('bookmarked_by')).order_by('-num_bookmarks')
result_list += list(tree_list)
result = list(OrderedDict.fromkeys(result_list))
context = {
'tree_result': result,
}
如果这里有什么遗漏,请告诉我,任何帮助将不胜感激。