0

我正在 Django 上开发一个图书销售应用程序,我需要从所售图书中获取最受欢迎的图书类别列表。

楷模:

class Category(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.TextField()

class Book(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.TextField()

class BookCategory(models.Model):
id = models.BigAutoField(primary_key=True)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
book = models.ForeignKey(Book, on_delete=models.CASCADE)

class Sales(models.Model):
id = models.BigAutoField(primary_key=True)
book = models.ForeignKey(Book, on_delete=models.CASCADE)

以下 SQL 相当于我的要求,但我不知道如何使用 Django 模型和过滤来使用它。

sql = "SELECT c.* FROM category c 
    INNER JOIN book_category bc ON c.id = bc.category_id 
    INNER JOIN sales s ON s.book_id = bc.book_id 
    GROUP BY c.id 
    ORDER BY count(s.id) DESC"

我已使用以下代码行来执行此操作,但出现错误。

categories = Category.objects.raw(sql)

“RawQuerySet”类型的对象不是 JSON 可序列化的

我怎样才能做到这一点?

4

1 回答 1

1

您可以在纯 ORM 中获得结果:

from django.db.models import Count

result = Category.objects.values('name').annotate(sell_count=Count('bookcategory__book__sales'))
于 2020-04-28T07:24:00.763 回答