Выбрать все записи из таблицы 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')
)