Как упорядочить результат запроса по количеству совпадений с параметрами запроса? - PullRequest
0 голосов
/ 23 октября 2019

Я сделал этот поиск в этой фотографии . Он ищет книги по названию, описанию, авторам, категориям.

Мне нужно упорядочить результат поиска по количеству совпадений [matchCount].

Я нашел некрасивое решение для циклов for,Какой лучший способ сделать это в django?

Условия:

  1. Если в параметрах поиска существует Title/Description: если он содержит название книги, matchCount+=1
  2. Если в параметрах поиска существует Title/Description: Если оно содержит описание книги, matchCount+=1
  3. Если в параметрах поиска существует authors: matchCount+=1 для каждого соответствующего автора книги.
  4. Если в параметрах поиска существует 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))
...