Я сделал этот поиск в этой фотографии . Он ищет книги по названию, описанию, авторам, категориям.
Мне нужно упорядочить результат поиска по количеству совпадений [matchCount
].
Я нашел некрасивое решение для циклов for,Какой лучший способ сделать это в django?
Условия:
- Если в параметрах поиска существует
Title/Description
: если он содержит название книги, matchCount+=1
- Если в параметрах поиска существует
Title/Description
: Если оно содержит описание книги, matchCount+=1
- Если в параметрах поиска существует
authors
: matchCount+=1
для каждого соответствующего автора книги. - Если в параметрах поиска существует
categories
: matchcount+=1
для каждой соответствующей категории, к которой относится книга.
Модели:
class Author(SafeDeleteModel):
name = models.CharField(max_length=255)
class Category(SafeDeleteModel):
title = models.CharField(max_length=255)
class Book(SafeDeleteModel):
title = models.CharField(max_length=255)
description = models.CharField(max_length=255)
authors = models.ManyToManyField(Author)
categories = models.ManyToManyField(Category)
Запрос:
filterObj = dict(request.POST)
orConditions = Q()
filterKeys = filterObj.keys()
bookTitleOrDescription = ''
authorList = categoryList = []
if 'bookTitleOrDescription' in filterKeys:
bookTitleOrDescription = filterObj['bookTitleOrDescription'][0]
orConditions = orConditions | Q(title__icontains=bookTitleOrDescription) | Q(description__icontains=bookTitleOrDescription)
if 'author[]' in filterKeys:
authorList = filterObj['author[]']
orConditions = orConditions | Q(authors__id__in=authorList)
if 'category[]' in filterKeys:
categoryList = filterObj['category[]']
orConditions = orConditions | Q(categories__id__in=categoryList)
searchedObjects = Book.objects.filter(orConditions).distinct().prefetch_related('authors','categories')
Заказ:
bookList = {}
for book in searchedObjects:
matchCount = 0
if 'bookTitleOrDescription' in filterKeys:
if bookTitleOrDescription in book.title.lower():
matchCount += 1
if bookTitleOrDescription in book.description.lower():
matchCount += 1
if 'author[]' in filterKeys:
for author in book.authors.all():
if str(author.id) in authorList:
matchCount += 1
if 'category[]' in filterKeys:
for category in book.categories.all():
if str(category.id) in categoryList:
matchCount += 1
if matchCount not in bookList.keys():
bookList[matchCount] = []
bookList[matchCount].append(book)
bookList = collections.OrderedDict(sorted(bookList.items(),reverse=True))