Выбрать все записи из таблицы News с включением имени соответствующей категории

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

Как реализовать этот запрос?

SELECT n.*, cat.name FROM news n LEFT JOIN category cat ON n.category_id=cat.id;

Новичок в ОРМ, пытаюсь разобраться на примерах, гуглом пользоваться, видимо не умею, если за 2 дня нарыл очень мало


Ответы (1 шт):

Автор решения: avtomato

Так как django для m2m создаёт промежуточную таблицу запрос будет выглядеть так:

SELECT n.*, cat.name FROM news n
    LEFT JOIN news_category nc on n.id = nc.news_id
    LEFT JOIN category cat ON nc.category_id = cat.id;

ORM:

queryset = (
    News
    .objects
    .annotate(category_name=F('category__name'))
    .defer('category')
)
→ Ссылка