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.

Другие вопросы по тегам