2016-10-09 5 views
0

У меня есть модель с полем time_stamp (поле DateTime), и я хочу получить последнюю запись каждого месяца.Последние записи каждого месяца

Как я могу подойти к этой проблеме?

Модель:

class Transaction (models.Model): 
    transaction_id = models.AutoField(primary_key=True) 
    net_monthly_transaction = models.DecimalField(max_digits = 10, decimal_places = 2, default=0) 
    # deposit or withdrawal (withdrawal with negative value) 
    amount = models.DecimalField(max_digits = 10, decimal_places = 2) 
    time_stamp = models.DateTimeField(default=datetime.now, blank=True) 


    def __str__(self):    # __unicode__ on Python 2 
     return str(self.time_stamp) + str(self.amount) + str(self.net_monthly_transaction) 

Это можно легко сделать в MySQL, который я знаком с, и есть много ответов на них в SO, вот пример:

SELECT * FROM table 
WHERE created_on in 
(select DISTINCT max(created_on) from table 
GROUP BY YEAR(created_on), MONTH(created_on)) 

Get last record of each month in MySQL....?

Как это сделать в Django? Любая помощь или руководство будут оценены.

Заранее благодарен,

+0

опубликовать модель – e4c5

+0

@ e4c5 Модель добавлен –

ответ

1

Вы можете попробовать нижеследующий код.

from django.db import connection 

truncate_date = connection.ops.date_trunc_sql('month', 'time_stamp') 
report = Transaction.objects.extra({'month':truncate_date}).values('month').annotate(last_record=Max('time_stamp')) 
+0

Я думаю, что не было ясно, с моим вопросом, ваш запрос работает, он четко определяет дату последнего входа в «last_record», я скорее хочу «net_monthly_transaction» значение от последней даты вступления в каждый месяц. Я просматриваю документы прямо сейчас, чтобы узнать, смогу ли я это понять, но буду искать ваше редактирование. Спасибо заранее, –

+0

Я почти понял это. Я использовал аннотацию для получения максимального «net_monthly_transaction» в каждом месяце. Проблема в том, что член может выйти, поэтому самый высокий не будет последним. Какие-либо предложения? –

+0

Вы хотите узнать о последнем net_monthly_transaction в месяц. Верный? Если да, приведенный выше запрос дает самую последнюю запись в месяц. Теперь, если вы хотите только «net_monthly_transaction». Вы можете сделать что-то вроде этого Transaction.objects.extra ({'month': truncate_date}). Values ​​('month'). Annotate (last_record = Max ('time_stamp')). Values_list ('net_monthly_transaction', flat = True) Если нет, можете ли вы объяснить, что именно вам нужно? – sriramganesh

Смежные вопросы