Django Annotate - получить список значений различных полей
У меня 3 модели - Book
, Page
а также Language
,
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
class Page(models.Model):
image = models.ImageField(upload_to='Uploaded_images')
language = models.ForiegnKey(Language, models.CASCADE)
book = models.ForeignKey(Book, models.CASCADE)
class Language(models.Model):
name = models.CharField(max_length=20)
Есть отношения один ко многим между Book
а также Page
объекты. Некоторые страницы в книге могут быть на другом языке, поэтому я добавил ForeignKey
в Page
модель, а не в Book
модель.
Я хочу получить список всех книг вместе с языками, на которых написаны их страницы.
Я попробовал это:
books = Page.objects.annotate(
name=F('book__title')
).values(
'name', 'book_id'
).distinct(
).annotate(
page_count=Count('id'),
).values(
'name', 'book_id', 'language'
)
Если в книге 2 языка, я получаю 2 записи для одного и того же названия книги. Мне просто нужна 1 запись для книги и я могу показать ее языки в виде списка.
Пример: если есть книга со страницами на любом из двух языков, испанском и английском, я хотел бы извлечь название книги и языки в ней как ['английский', 'испанский'].
Это выполнимо?
1 ответ
Если вы используете Postgres, возможно, вам нужно начать получать данные из class Book
и использовать ArrayAgg
,
Ссылка: поле аннотации набора запросов Django должно быть списком / набором запросов
Если вы используете rest-framework, вы можете использовать Serializer.