2012-04-06 50 views
9

Tôi có một mô hình với một lĩnh vực datetime:Hãy so sánh ngày tháng và datetime trong Django

class MyModel(models.Model): 
    created = models.DateTimeField(auto_now = True) 

Tôi muốn có được tất cả các hồ sơ được tạo ra ngày hôm nay.

tôi đã cố gắng:

MyModel.objects.all().filter(created = timezone.now()) 

MyModel.objects.all().filter(created = timezone.now().date()) 

Nhưng luôn luôn có một tập rỗng. Cách chính xác trong Django để làm điều này là gì?

EDIT:

Có vẻ lạ, nhưng một kỷ lục, tạo ra ngày hôm nay (06.04.2012 23:09:44) có ngày (2012/04/07 04:09:44) trong cơ sở dữ liệu. Khi tôi đang cố gắng chỉnh sửa nó trong bảng quản trị nó có vẻ chính xác (06.04.2012 23:09:44). Django có xử lý nó bằng cách nào đó không?

+1

Có vẻ như bạn đang gặp sự cố múi giờ. Theo [tài liệu] (https://docs.djangoproject.com/en/1.4/topics/i18n/timezones/) ngày cửa hàng django với thông tin múi giờ như UTC trong cơ sở dữ liệu. – mklauber

Trả lời

13

Có thể có một giải pháp thích hợp hơn, nhưng một workup nhanh chóng cho thấy rằng điều này sẽ làm việc:

from datetime import timedelta 

start_date = timezone.now().date() 
end_date = start_date + timedelta(days=1) 
Entry.objects.filter(created__range=(start_date, end_date)) 

tôi giả sử múi giờ là một đối tượng datetime-như thế nào.

Điều quan trọng là bạn đang lưu trữ thời gian chính xác, xuống đến mili giây và bạn so sánh nó với thứ gì đó chỉ có độ chính xác trong ngày. Thay vì quăng giờ, phút và giây, django/python mặc định là 0. Vì vậy, nếu hồ sơ của bạn là sáng tạo tại 2011-4-6T06: 34: 14am, sau đó nó so sánh 2011-4-6T: 06: 34: 14am đến 2011-4-6T00: 00: 00, không phải 2011-4-6 (từ ngày tạo) đến 2011-4-6 (từ timezone.now(). date()). Hữu ích?

+0

Có điều đó ... có vẻ kỳ lạ, nhưng một bản ghi, được tạo hôm nay (06.04.2012 23:09:44) có ngày (2012-04-07 04:09:44) trong cơ sở dữ liệu. Django có xử lý nó bằng cách nào đó không? –

+0

Nó đã giúp, cảm ơn bạn! –

+0

@Just_Mad, Yep, django lưu trữ mọi thứ dưới dạng UTC trong cơ sở dữ liệu. – mklauber

0

Hãy thử điều này

from datetime import datetime 
now=datetime.now() 
YourModel.objects.filter(datetime_published=datetime(now.year, now.month, now.day)) 
+2

Sẽ không hoạt động, bạn vẫn sẽ so sánh 2011-04-06TXX: XX: XX đến 2011-04-06T00: 00: 00. Điều này sẽ sai, trả về Không. – mklauber

+0

Tôi không thấy nó không hoạt động như thế nào. Đó là tương đương chính xác của "SELECT * FROM bảng WHERE date = '2002-04-05'" – luke14free

+0

YourModel.objects.filter (created__published = datetime (now.year, now.month, now.day)), tôi có đúng không? –

Các vấn đề liên quan