запись модели списка Django с несколькими ссылками - PullRequest
0 голосов
/ 30 октября 2018

У меня есть следующие модели, которые представляют песни и пьесы каждой песни:

from django.db import models


class Play(models.Model):
     play_day = models.PositiveIntegerField()
     source = models.CharField(
         'source',
         choices=(('radio', 'Radio'),('streaming', 'Streaming'), )
     )
     song = models.ForeignKey(Song, verbose_name='song')    


class Song(models.Model):

     name = models.CharField('Name')

Изображение У меня есть следующие записи:

Песня:

|ID | name                |
|---|---------------------|
| 1 | Stairway to Heaven  |
| 2 | Riders on the Storm |

Воспроизведение:

|ID | play_day | source    | song_id |
|---|----------|-----------|---------|
| 1 | 2081030  | radio     | 1       |
| 1 | 2081030  | streaming | 1       |
| 2 | 2081030  | streaming | 2       |

Я бы хотел перечислить все треки следующим образом:

| Name                | Day        | Sources          |
|---------------------|------------|------------------|
| Stairway to Heaven  | 2018-10-30 | Radio, Streaming |
| Riders on the Storm | 2018-10-30 | Streaming        |

Я использую Django==1.9.2, django_tables2==1.1.6 и django-filter==0.13.0 с PostgreSQL.

Проблема: Я использую Song в качестве модели таблицы и фильтра, поэтому набор запросов начинается с выбора FROM song. Однако, когда я присоединяюсь к столу Play, я получаю две записи в случае «Лестницы на небеса» (я знаю, что даже одна - это слишком много: https://www.youtube.com/watch?v=RD1KqbDdmuE).

Что я пробовал:

  • Я попытался указать отличное для Песни, хотя это приводит к проблеме, которую я не могу отсортировать для других столбцов, кроме Song.id (предположим, что я различаю в этом столбце)

  • Aggregate: на самом деле это конечное состояние словаря, которое нельзя использовать с django_tables.

  • Я нашел это решение для PostgreSQL Выбор строк, упорядоченных по одному столбцу и отличных от другого , хотя я не знаю, как это сделать с django.

Вопрос: Каков был бы правильный подход, чтобы показывать одну дорожку на строку, «агрегируя» информацию из ссылок, используя ORM Джанго?

1 Ответ

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

Я думаю, что правильный способ сделать это - использовать функцию array_agg postgresql (http://postgresql.org/docs/9.5/static/functions-aggregate.html и http://lorenstewart.me/2017/12/03/postgresqls-array_agg-function).

Кажется, что Джанго действительно поддерживает это (по крайней мере, в версии 2.1: http://docs.djangoproject.com/en/2.1/ref/contrib/postgres/aggregates/), таким образом, это похоже на путь.

К сожалению, у меня нет времени, чтобы проверить это прямо сейчас, поэтому я не могу дать исчерпывающий ответ; однако попробуйте что-то вроде: Song.objects.all().annotate(ArrayAgg(...))

...