Ребята, у меня вот такая модель:
class Interaction(DateAwareModel, UserAwareModel):
page = models.ForeignKey(Page)
container = models.ForeignKey(Container, blank=True, null=True)
content = models.ForeignKey(Content)
interaction_node = models.ForeignKey(InteractionNode)
kind = models.CharField(max_length=3, choices=INTERACTION_TYPES)
Я хочу иметь возможность выполнить один запрос, чтобы получить количество взаимодействий, сгруппированных по контейнеру, а затем по типу. Идея состоит в том, что структура выходных данных JSON (о сериализации заботится поршень) будет выглядеть так:
"data": {
"container 1": {
"tag_count": 3,
"com_count": 1
},
"container 2": {
"tag_count": 7,
"com_count": 12
},
...
}
SQL будет выглядеть так:
SELECT container_id, kind, count(*) FROM rb_interaction GROUP BY container_id, kind;
Любые идеи о том, как сгруппировать по нескольким полям с помощью ORM? (Я не хочу писать необработанные запросы для этого проекта, если я могу избежать id) Это кажется простым и распространенным запросом.
Прежде чем вы спросите: я видел документацию по агрегатам django и документацию по необработанным запросам.
Обновить В соответствии с приведенным ниже советом я создал собственный менеджер для обработки этого:
class ContainerManager(models.Manager):
def get_query_set(self, *args, **kwargs):
qs = super(ContainerManager, self).get_query_set(*args, **kwargs)
qs.filter(Q(interaction__kind='tag') | Q(interaction__kind='com')).distinct()
annotations = {
'tag_count':models.Count('interaction__kind'),
'com_count':models.Count('interaction__kind')
}
return qs.annotate(**annotations)
Это подсчитывает только те взаимодействия, которые относятся к типу тегов или сообщений, вместо того, чтобы получать количество тегов и сообщений через группу. Очевидно, что это работает так из кода, но интересно, как это исправить...