Django / Python3: преобразовать сложный запрос внутреннего соединения в - PullRequest
0 голосов
/ 28 апреля 2020

Я разрабатываю приложение для продажи книг на 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 сериализуемый

Как я могу выполнить sh это?

1 Ответ

1 голос
/ 28 апреля 2020

Вы можете получить результат в чистом ORM как,

from django.db.models import Count

result = Category.objects.values('name').annotate(sell_count=Count('bookcategory__book__sales'))
...