2017-01-24 3 views
1

Пусть мои модели:Джанго фильтр QuerySet на основе подсчета другого QuerySet

model book 
    charfield name 

model review 
    charfield bookname 

Есть ли способ фильтрации/исключить книги с обзором рассчитывать ноль? Я просмотрел это полностью на stackoverflow, но не смог найти ответ. Это не вопрос домашней работы. У меня есть запрос около. размером около 200 000, из которого я пришел к выводу, что фильтр не является фильтром, преобразовывая запрос в список python, фильтруя, а затем конвертируйте обратно. Может кто-то помочь мне с этим? Благодаря

+1

Есть ли причина, по которой ваша модель обзора имеет charfield с именем книги вместо внешнего ключа напрямую к коррекции t Объект книги? Фильтр будет легче сделать, если модели действительно связаны. Кроме того, из вашего вопроса неясно, хотите ли вы сохранить или исключить книги без отзывов с вашего запроса. – ChidG

+0

@ChidG спасибо за ответ. Скажем, у меня огромное количество книг и обзоров, я думал, что связывание обзора с книгой каждый раз, когда я добавляю ее, займет слишком много времени из-за времени поиска. Должна ли связывать их с тем, чтобы сделать это в пользу этого? – verticese

+0

Связывание их с помощью внешнего ключа - это, безусловно, стандартный, лучший способ решения этой проблемы. Время соединения базы данных между двумя таблицами будет намного меньше проблем, чем другие проблемы, вызванные их не связыванием. Например, ваша база данных должна быть намного больше (на диске), поскольку имена книг должны быть сохранены в нескольких местах. И что происходит, когда у вас более одной книги с тем же именем? Или когда кто-то неправильно вводит имя книги в обзоре? Я бы посоветовал вам немного почитать о реляционной базе данных. – ChidG

ответ

1

Во-первых, вы можете запросить список книги, которая имеет обзор, а затем получить комплимент, используя Джанго exclude

bookname_has_review = Review.objects.all().distinct().values_list('bookname', flat=True) 
book_not_have_review = Book.objects.all().exclude(name__in=bookname_has_review) 
2

Потому что я настоятельно рекомендуется изменить свои модели, чтобы включать в себя внешний ключ из обзора книги (для многих других преимуществ этого), а не пытаться решить точную проблему, о которой вы просили, я собираюсь дать вам подсказку о том, как писать ваши модели с помощью внешнего ключа, а затем, как решить проблему, которую вы - спросил он в контексте отношений с внешним ключом.

Вот новые модели, я думаю, вы должны написать:

from django.db import models 

class Book(models.Model): 
    name = models.Charfield() 

class Review(models.Model): 
    book = models.ForeignKey(Book, related_name='reviews') 

Затем, чтобы фильтр для всех книг, имеющих какие-либо отзывы вы можете сделать:

books_with_reviews = Book.objects.filter(reviews__isnull=False).distinct() 

Или для книг без обзоров:

Book.objects.filter(reviews__isnull=True).distinct() 
+0

Спасибо, я изменю свою схему. Это хорошая идея. – verticese

Смежные вопросы