Выборка данных из базы. QuerySet?

Здравствуйте!
Суть вопроса в следующем. Пробую написать простое приложение по сбору числа рабочих на объектах. Есть модели
models
class SObjects(models.Model):
  title = models.CharField(max_lenght=128)

class Subpodr(models.Model):
  sobj = models.ForeignKey(SObjects)
  name = models.CharField(max_lenght=128)

class Peoples(models.Model):
  sobj = models.ForeignKey(SObjects)
  subpodr = ForeignKey(Subpodr)
  date = models.DateField(default=datetime.datetime.today())
  rab = models.IntegerField(default = 0)


Соответственно SObjects - модель с описанием объектов, на которых работают люди.
Subpodr - субподрядные организации (На одном объекте может быть несколько организаций)
Peoples - модель, собирающая численность рабочих.
На веб странице хочу выводить следующим образом.
На главной в виде таблицы с датами и суммой рабочих по объекту на каждый день.
При нажатии на объект список с подрядчиками и численность по датам.

Вопрос как из базы вернуть словарь с (данные будут выбираться всегда за месяц)
{Дата : {Объект 1: {Подрядчик 1: Кол-во Рабочих, Подрядчик 2: Кол-во рабочих}}, Дата 2 ....}

Или в любом другом удобном виде.
Смотреть думаю надо в сторону либо annotate, aggregate или в чистый sql (extra)

Написал функцию которая считает сумму людей по 1 объекту за определённый день
def calc(sobj, date):
  return Peoples.objects.filter(date=date, sobj=sobj).aggregate(Sum('rab'))
  • Вопрос задан
  • 1294 просмотра
Решения вопроса 1
winordie
@winordie
Лучшая документация -- исходники
Если все правильно помню:
class Peoples(models.Model):
  subpodr = ForeignKey(Subpodr)
  date = models.DateField(default=datetime.datetime.today())
  rab = models.IntegerField(default = 0)
  class Meta:
    unique_together = ('subpodr', 'date')

peoples_for_main_page = Peoples.objects.values('subpodr__sobj', 'date', 'rab').annotate(
  num_peoples=Sum('rab')).order_by('date', 'subpodr__sobj')

sobject = Sobject.objects.get(pk=current_sobject_pk)
peoples_for_sobject_page = Peoples.objects.filter(subpodr__sobj=sobject).annotate(
  num_peoples=Sum('rab')).order_by('date', 'subpodr')
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы