Django запрос для нескольких групп по - PullRequest
1 голос
/ 30 марта 2020
A

id name city
1  A     USA
2 BB    UK
3 CC    USA

B
id house_color
1   RED
2   Blue
3   Green

Я хочу сгруппировать по обеим таблицам в Django Таким образом, результат может быть.

[
{
"city": "USA",
"RED": 1,
"Green": 1
},
{
"city": "UK",
"Blue": 1
}
] 

so far i have done this
b = B.objects.all()
b.annotate(city=F('A__id')).values("city","house_color").annotate(Count('house_color')))

Может кто-нибудь, пожалуйста, помогите мне получить желаемый результат Спасибо.

здесь id - это внешний ключ.

class A(CommonModel):
   id = models(primary_key=True, on_delete=models.CASCADE)
   city = models.CharField(max_length=20, null=False, default=None)

class B(CommonModel):
   id=models.OneToOneField('A',primary_key=True, on_delete=models.CASCADE)
    colour = models.CharField(max_length=20, null=False, default=None)     

1 Ответ

2 голосов
/ 30 марта 2020

Вы можете пост-обработать запрос. Итак, здесь мы можем сначала запросить базу данных с помощью:

qs = B.objects.values(city=F('id__city'), house_color=F('colour')).annotate(
    n=Count('house_color')
).order_by('city', 'house_color')

Затем мы можем составить список словарей с помощью функции groupby из itertools:

from itertools import groupby
from operator import itemgetter

result = [
    {
        'city': k,
        **{v['house_color']: v['n'] for v in vs}
    }
    for k, vs in <b>groupby(qs, itemgetter('city'))</b>
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...