Использование datetime для сравнения с датами в Django - PullRequest
7 голосов
/ 05 января 2011

У меня есть вопрос в Django о том, как вы можете сравнить даты, чтобы найти решение.Например, у меня есть поле даты в моем models.py, как показано ниже.

class Invoice(models.Model):
    payment_date = models.DateTimeField()

Что я хочу сделать, это спросить, есть ли способ сравнить datetime.now с DateTimeField.Например, если у меня был список дат оплаты, и я хотел бы сравнить с датой и временем сейчас.Оплаченные даты платежа, которые опаздывают со своими платежами, показаны в обязательном порядке.В противном случае это значение равно нулю.

Вот мои взгляды, чтобы показать, что происходит.До сих пор я пытался, но я получаю значение 0 для параметра payment_date, которое является более поздним, чем дата платежа.

Правка здесь - мои последние просмотры.Забавно то, что я, кажется, получаю owing = invoice_gross для всех результатов - в отличие от того, когда я получал все 0.Так что он все еще не работает должным образом.

@login_required
def homepage(request):
    invoices_list = Invoice.objects.all()
    invoice_name = invoices_list[0].client_contract_number.client_number.name
    invoice_gross = invoices_list[0].invoice_gross
    payment_date = invoices_list[0].payment_date
    if payment_date <= datetime.now():
        owing = invoice_gross
        if payment_date > datetime.now():
            owing = 0
    return render_to_response(('index.html', locals()), {'invoices_list': invoices_list ,'invoice_name':invoice_name, 'invoice_gross':invoice_gross,'payment_date':payment_date,'owing':owing}, context_instance=RequestContext(request))

О, и мой стол в основном делает что-то вроде этого.

ID  Owing
1   100   (All the same value)
2   100
3   100
.   .
.   .
.   .

Ответы [ 2 ]

9 голосов
/ 05 января 2011

Используйте datetime.now() (обратите внимание на скобки).Кроме этого, помните, что поле всегда будет datetime объектом.Кроме того (я полагаю, что) вы должны проверить только date из datetime , чтобы соответствовать текущей дате (иначе она будет соответствовать только этой конкретной секунде).Для этого вы должны проверить, если payment_date.date() == date.today() (где date равно datetime.date)

Это также означает, что вы можете фильтровать следующим образом: Invoice.objects.filter(payment_date__lte=datetime.now()).

__lte, __gte, __lt, __gt используются для <=, >=, < и >

7 голосов
/ 05 января 2011

Я думаю, что проблема в строке

if datetime.now() == payment_date:

Это будет буквально видеть, если payment_date равно прямо сейчас .Я думаю, что вы хотите посмотреть, больше или равно теперь payment_date, и в этом случае вы должны использовать

if datetime.now() >= payment_date:

. Вы также можете просто отфильтровать счета при запросе к базе данных:

invoices_list = Invoice.objects.filter(payment_date__lte=datetime.now())

Обновление

Ваш код неверен, поскольку у вас есть взаимоисключающие условия.Посмотрите:

if payment_date <= datetime.now():
    owing = invoice_gross
    if payment_date > datetime.now():
        owing = 0

Сначала проверяется, есть ли payment_date раньше.Затем он устанавливает owing в invoice_gross. Затем , в том же условном , он проверяет, будет ли payment_date после этого.Но этого не может быть!Вы находитесь только в этом блоке кода, если payment_date равен до сейчас!

Я думаю, что у вас есть ошибка отступа, и вы хотите вместо этого:

if payment_date <= datetime.now():
    owing = invoice_gross
if payment_date > datetime.now():
    owing = 0

Что, конечно, так же, как:

if payment_date <= datetime.now():
    owing = invoice_gross
else:
    owing = 0
...