Вывести количество записей в таблице News для каждой записи в таблице Categories
Вывести количество записей в таблице News для каждой записи в таблице Categories. Отсортировать записи по имени категории в порядке возрастания
Связь M2M
Привет, есть сложности с ОРМ
from django.db import models
from django.conf import settings
class Category(models.Model):
name = models.CharField(max_length=200)
def __str__(self):
return self.name
class News(models.Model):
title = models.CharField(max_length=200)
body = models.TextField()
is_published = models.BooleanField(default=False)
category = models.ManyToManyField(Category)
def publish(self):
self.is_published = True
self.save()
def __str__(self):
return self.title
Запрос на posgresql написать смог, а как перенести его на django ORM пока не знаю.
SELECT ct.name, count(n.category_id) FROM category ct
LEFT JOIN news n ON ct.id=n.category_id
GROUP BY ct.name, category_id
ORDER BY category_id DESC
Не понимаю как работать с агрегатными функциями и забирать нужные поля из выборки
Ответы (1 шт):
Автор решения: avtomato
→ Ссылка
Если требуется сортировка по имени категории в порядке возрастания запрос будет выглядеть так:
SELECT "category"."name" AS "name", COUNT("news"."id") AS "cnt"
FROM "news"
LEFT OUTER JOIN "news_category" ON ("news"."id" = "news_category"."news_id")
LEFT OUTER JOIN "category" ON ("news_category"."category_id" = "category"."id")
GROUP BY "category"."name"
ORDER BY "category"."name" ASC;
ORM:
queryset = (
News
.objects
.values('category__name')
.annotate(name=F('category__name'))
.annotate(cnt=Count('id'))
.order_by('category__name')
.values('name', 'cnt')
)