2017-02-13 2 views
0

Я хочу направить это на свой другой Question здесь, SO, поэтому я пытаюсь показать цену в месяц и составить таблицу с 12 месяцами, ряд с общим доходом проекта в месяц, поэтому я успешно рассчитывается моей цена, используяDjango annotate цена за месяц

context["price_aux"] = Project.objects.annotate().aggregate(Sum("price_aux"))

Я могу показать мои данные в таблице и просто сделать ряд общего для этого, но, как вы можете видеть из моего предыдущего вопроса я хочу комментировать это в месяц и сделать таблицу, а затем отобразить общее количество за месяц, но мне очень трудно понять, как я могу извлечь это из своей базы данных, так что это правильный способ сделать это в django==1.8+, я вижу, что в в последней версии они добавили Extract, но я не могу использовать его в 1.8, вторая вещь django extra они заявили здесь Use this method as a last resort, так что вы можете мне объяснить, как я могу это сделать.

+0

Почему бы вам не использовать таблицу с двумя столбцами, один за месяц и один для цены. Затем вы можете просто выбрать цену по месяцам. –

+0

Я использую что-то подобное, но мне сложно извлечь мольбу из db, можно сделать небольшой пример? – PetarP

+0

Предполагая, что ваша модель называется «Цены» и имеет два поля «месяц» и «цена», вы делаете 'ppm = Prices.objects.filter (month = 1) [0]'. «ppm.price» дает вам фактическую цену. –

ответ

1

Мое предложение состоит в том, что вы добавляете поле в свою модель, так как невозможно использовать __month в .values_list. Values_list может использоваться для группировки ваших запросов перед аннотацией.

Поле может быть чем-то вроде.

year_month = models.CharField(index=True) 

Вы можете перезаписать метод сохранения на вашей модели и сделать что-то вроде

def save(self, *args, **kwargs) 
    # Not sure if auto_add_now already set the value, could use timezone.now() 
    if not self.id: # thus not saved yet 
     self.year_month = self.created_at.strftime("%Y%m") 
    super(Model, self).save(*args, **kwargs) 

Теперь его можно аннотировать цены.

Project.objects.values_list('year_month').annotate(price_sum=Sum("price_aux")) 

Если вам нужна дополнительная информация, я полагаю, что вы могли бы расширить значения_list.

Project.objects.values_list('year_month').annotate(price_sum=Sum("price_aux")) \ 
    .values_list('name', 'year_month', 'price_sum') 

Выполнение этого требования без добавления поля возможно. Скажите, вы хотите, чтобы в прошлом году.

import datetime 
from django.utils import timezone 

def my_list_view(request): 
    end = timezone.now() 
    # note, could do some weird stuff in years with 366 days 
    begin = (end - datetime.timedelta(days=365)).replace(day=1) 

    container = {} 
    while begin < end: 
     container[begin.strftime("%Y%m")] = 0 
     begin = (begin + datetime.timedelta(weeks=5).replace(day=1) 

    for project in Project.objects.iterator(): 
     container[project.created_at.strftime("%Y%m")] += price 

    # Now you can render your template 
+0

Хорошо, стоит ли делать этот расчет * hand *, используя iterator() в моем 'ListView' и не добавляя новое поле в' models.py', это интересно, тем не менее, я попробую, я было просто интересно об этом больше python способ расчета цены за месяц – PetarP

+0

Я использую общий шаблон ListView для этого шаблона, поэтому я могу сделать 'mixin' и сделать это вычисление – PetarP

+0

Никогда не использовал' ListView', также никогда слышал о микшинге в Django, но рад, что мой ответ помог вам. – Blackeagle52

0

Произнесите модель называется Prices и имеет два поля date и price где date это поле даты и времени. Затем вы можете использовать date__month (обратите внимание на двойное подчеркивание) в качестве аргумента ключевого слова для методов запроса (см. Документы для field lookups).

Вы можете получить цену на месяц через

Prices.objects.get(date__month=1).price