Использование datetime для сравнения с датами в Django

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

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

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

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

Edit вот мои последние представления. Забавно, что я, похоже, получаю 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 ответов


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

if datetime.now() == payment_date:

это буквально увидит, если payment_date is прямо сейчас. Я думаю, вы хотите увидеть, больше ли сейчас или равно 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 to invoice_gross. затем, в том же условном, он проверяет, если payment_date после Теперь. Но этого не может быть! Вы находитесь только в этом блоке кода, если payment_date is до сейчас!

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

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

использовать datetime.now() (обратите внимание на скобки). Кроме этого, помните, что поле будет всегда быть