Вы можете агрегировать минимальную и максимальную временную отметку и сумму суммы:
from django.db.models import Min, Max, Sum
def average_spending_per_day():
aggregate = Payment.objects.aggregate(Min('timestamp'), Max('timestamp'), Sum('amount'))
min_datetime = aggregate.get('timestamp__min')
if min_datetime is not None:
min_date = min_datetime.date()
max_date = aggregate.get('timestamp__max').date()
total_amount = aggregate.get('amount__sum')
days = (max_date - min_date).days + 1
return total_amount / days
return 0
Если есть min_datetime
, то в таблице БД есть некоторые данные, а также есть максимальная дата и общее количество. сумма, в противном случае мы возвращаем 0 или что вы хотите.
В некоторых ситуациях это быстрее и более удобно не привлечь использование события краски, но получение Графического объекта от управления/формы и подрисовывания это. Это может дать некоторые проблемы с искажением/текстом непрозрачности / анти-искажением/текстом и т.д., но могло стоить проблемы с точки зрения не необходимости перекрасить целую хижину. Что-то вроде:
private void AnimationTimer_Tick(object sender, EventArgs args)
{
// First paint background, like Clear(Control.Background), or by
// painting an image you have previously buffered that was the background.
animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++]));
}
я использую это в некоторых Средствах управления сам и имею буферизованные изображения для "очищения" фона с, когда перемещения предмета интереса или должны быть удалены.
Я создал библиотеку, которая может помочь с этим. Она называется Transitions и может быть найдена здесь: http://code.google.com/p/dot-net-transitions/
. Для анимации используются таймеры, работающие в фоновом потоке. объекты. Библиотека с открытым исходным кодом, поэтому, если она вам пригодится, вы можете посмотреть код, чтобы увидеть, что она делает.
То, что Вы делаете, является единственным решением, которое я когда-либо использовал в WinForms (таймер с постоянными изменениями). Существует набор методов, которые можно использовать для создания опыта пользователя с ним более гладким (такого как двойная буферизация).
Вы могли бы хотеть дать WPF попытку. Существуют встроенные средства для того, чтобы сделать анимации в WPF, и они являются намного более гладкими (и потребуйте меньшего количества кода и никакой синхронизации с Вашей стороны), чем основанное на таймере решение.
Примечание, что Вы не должны использовать WPF всюду по своему целому приложению для того решения; возможно упаковать эту функциональность в WPF, управляют и встраивают управление в приложение WinForms (или неуправляемое приложение, в этом отношении):