Django Annotate - получить список значений различных полей - PullRequest
0 голосов
/ 01 ноября 2018

У меня 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 запись для книги и я могу показать ее языки в виде списка.

Пример: если есть книга со страницами на любом из двух языков, испанском и английском, я бы хотел извлечь название книги и языки в ней как ['English', 'Spanish'].

Это выполнимо?

1 Ответ

0 голосов
/ 02 ноября 2018

Если вы используете Postgres, возможно, вам нужно начать получать данные из class Book и использовать ArrayAgg.

Ссылка: Поле аннотации набора запросов Django для списка / набора запросов

Если вы используете rest-framework, вы можете использовать Serializer.

...