2014-09-18 30 views
3

我有以下Django模型:如何標註在多個Django模型

class Book(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=200) 

    class Meta: 
     db_table = "books" 

class BookCategory(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=50) 

    class Meta: 
     db_table = "bookcategories" 

class BookCategoryMembership(models.Model): 
    id = models.AutoField(primary_key=True) 
    category = models.ForeignKey(BookCategory) 
    book = models.ForeignKey(Book) 

    class Meta: 
     db_table = "bookcategories_books" 

class UserBook(models.Model): 
    id = models.AutoField(primary_key=True) 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True) 
    book = models.ForeignKey(Book) 

    class Meta: 
     db_table = "user_book" 

UserBook模型來表示,如果用戶擁有一本書。

現在,我想返回所有圖書類別的列表,按照大多數圖書的數量排序(即最熱門的類別應該首先出現)。

我試着用Django的ORM註解,但我沒有得到它的工作。

這是行不通的子查詢:

BookCategoryMembership.objects.annotate(num_books=Count("book__userbook")). 
values('category_id').annotate(Sum('num_books')) 

(導致錯誤信息

FieldError: Cannot compute Sum('num_books'): 'num_books is an aggregate" 

我知道,從這個子查詢中,ORDER_BY子句人仍下落不明,但我相信我必須先讓子查詢先行工作

你知道用哪個查詢我可以在django中解決這個問題嗎?我想避免將它分解爲多個查詢或在Django中進行任何計算。

+0

在一個QuerySet中與聚合中的重用列有相同的問題。 – 2017-04-14 10:43:41

回答

0

您可以使用RawSQL('any raw expression',())作爲解決方法。