Подсчет и суммирование значений записей, отфильтрованных по словарю внешних ключей в Django - PullRequest
1 голос
/ 28 декабря 2011

У меня проблема с запросом Django для этой упрощенной модели:

class Client(models.Model):
    user_name = models.CharField

class Task(models.Model):
    client = models.ForeignKey(
                               'Client',
                               )
    task_type = models.ForeginKey(
                                  'Task_Type',
                                  )

class Task_Type(models.Model):
    name = models.CharField

class Task_Value(models.Model):
    value_num = models.DecimalField
    task = models.ForeignKey(
                             'Task',
                              )  

У меня есть список внешних ключей, созданный методом Client.Я хочу сделать две вещи, во-первых, я хочу подсчитать все задачи, которые имеют тип_задачи по имени "XYZ", ограниченный клиентами в словаре.Во-вторых, я хочу суммировать все значения value_num для всех заданий по имени «ABC», ограниченное «Клиенты» в словаре.Эти два значения будут суммированы и разделены на количество клиентов в словаре

Ниже приведен метод, который у меня есть (и работает) для одного клиента, но у меня возникают проблемы с повторением этого по списку,

cnt = Task.objects.filter(client=self.pk,event_type__name__exact="XYZ").count()
tasks = Task.objects.filter(client=self.pk,event_type__name__exact="ABC")[0]
value = tasks.task_value_set.get(field__name__exact='ABC').value_num
answer = int(cnt+value)  

РЕДАКТИРОВАТЬ: Список получен из этого:

group = Client.objects.filter(pk__in=client_list)  

, где метод генерирует список клиентов.

1 Ответ

2 голосов
/ 28 декабря 2011

Подсчитать все задачи, которые имеют task_type с именем "XYZ", ограничено клиентами из набора запросов

Task.objects.filter(client__in=clients, task_type__name='XYZ').count()

Суммировать все value_num для всехзадачи с именем «ABC», ограниченные клиентами в наборе запросов.

from django.db.models import Sum

Task.objects.filter(client__in=clients, task_type__name='ABC').annotate(Sum('task_value__value_num'))
...