аннотация django с динамическим именем столбца - PullRequest
0 голосов
/ 11 февраля 2019

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

class items(models.Model):
    name = models.CharField(max_length=50)
    location = models.CharField(max_length=3)

Я хотел создать сводную таблицу для подсчета каждого местоположения для каждого имени / элемента, что мне удалось сделать какпо следующему:

queryset_res = items.objects.values('name')\
                            .annotate(NYC=Sum(Case(When(location='NYC', then=1),default=Value('0'),output_field=IntegerField())))\
                            .annotate(LND=Sum(Case(When(location='LND', then=1),default=Value('0'),output_field=IntegerField())))\
                            .annotate(ASM=Sum(Case(When(location='ASM', then=1),default=Value('0'),output_field=IntegerField())))\
                            .annotate(Total=Count('location'))\
                            .values('name', 'NYC', 'LSA','Total')\
                            .order_by('-Total')

Это дает мне, сколько раз каждое имя появляется на каждом месте, что все в порядке.

Мой вопрос, как я могу сделать местоположение динамическим, и поэтому, еслиновые места, где добавлены, я не вернулся и снова изменить код!либо из списка, либо из данных самой модели

Большое спасибо AB

1 Ответ

0 голосов
/ 11 февраля 2019

Вы можете связать динамический параметр с помощью *[1, 2, 3], **{'key': 'value'} в python.

def get_annotation(key='NYC'):
    return {
        key: Sum(Case(When(localtion=key), then=1), default=Value('0'), output_field=IntegerField()),
    }

queryset_res = items.objects.values('name')
location_list = ['NYC', 'LSA', 'ASM', ...etc]
for key in location_list:
    queryset_res = queryset_res.annotate(**get_annotation(key))

queryset_res = queryset_res.annotate(Total=Count('location')) \
    .values('name', 'Total', *location_list) \
    .order_by('-Total')

Теперь вы можете реализовать набор запросов, просто изменив location_list.

...