2011-08-15 14 views
0

私はdb内で最も人気のある100冊の書籍のリストを取得し、そのリストにある固有のカテゴリのリストを作成しようとしています。ここに私の簡素化帳、お気に入り、およびカテゴリーのモデルです:Django QuerySet:なぜ注釈付きQuerySetをフィルタリングできないのですか?

class Book(models.Model): 
    name = models.CharField(max_length=100) 
    category = models.ForeignKey(Category) 

class Favorite(models.Model): 
    user = models.ForeignKey(User) 
    book = models.ForeignKey(Book) 

class Category(models.Model): 
    name = models.CharField(max_length=100) 

私は簡単に次のクエリを使用して100冊の最も人気のある本のリストを取得することができます。

books = Book.objects.annotate(num_favorites=Count('favorite')).order_by('-num_favorites')[:100] 

しかし、私は問題をされた開始を私が最も人気のある100の本のユニークなカテゴリのリストを取得しようとすると、次のクエリは機能しません(以下のエラーが表示されます)。理由を理解できないようです。

>>> categories = Category.objects.filter(book__in=books).distinct() 
>>> categories 


FieldError: Cannot resolve keyword 'num_favorites' into field. Choices are: category, favorite, id, name 

誰かが私がここで紛失していることについて少し光を当てることができますか?

答えて

3

1つのクエリにあまりにも多くのものを積み重ねているかもしれません。それを分割してみてください。

book_ids = (Book.objects.annotate(num_favorites=Count('favorite')) 
    .order_by('-num_favorites')[:100].values_list('id', flat=True)) 
categories = Category.objects.filter(book__in=book_ids).distinct() 
+0

感謝@マイクを、私はそれを試してみましたが、最初のクエリ 'book_ids =(Book.objects.annotate(num_favorites =カウント( '好きな')) .order_by( ' - num_favorites')[ :100] .values_list( 'id'、flat = True)) 'FieldError:キーワード 'num_favorites'をフィールドに解決できません。本当に困惑しています... –

+0

私は複数フィールドの値を取得できますorder_by( ' - num_favorites')[:100] .values_list( 'id'、 'num_favorites') 'これは私に'タイプエラー:複数フィールドのValuesListQuerySetをフィルタ値として使用できません。 'というエラーが表示されます。 –

+0

'list(Book.objects.annotate(num_favorites = Count( 'favorite'))。order_by( ' - num_favorites')[:100]' 'できますか? –

関連する問題