2012-03-31 30 views
6

Tôi có một mô hình Django với Datefield và Timefield riêng biệt cho một sự kiện. Có cách nào để chuyển đổi nó thành một đối tượng datetime datthon để tôi có thể truy vấn cho các sự kiện sắp tới với một số độ chính xác? Hiện tại tôi chỉ nhận được sắp tới của ngày hôm sau.Django datefield và timefield để python datetime

models.py

event_time = models.TimeField() 
event_date = models.DateField() 

Về cơ bản, tôi có thể lọc với một phút, hoặc thậm chí chia Precition thứ hai?

Cảm ơn bạn.

+1

Không chắc chắn tại sao điều này lại bị giảm giá:/ –

+0

Tôi không gặp vấn đề gì khi được giảm hạng, nhưng tôi chắc chắn không "không có nỗ lực nghiên cứu", tôi sẽ không đăng lên SO. Vấn đề là tôi muốn tránh thay đổi mô hình cơ sở dữ liệu, ít nhất là bây giờ, và tôi không biết cách truy vấn với hai trường này. Tôi có thể xác định, bên trong lớp tổ chức sự kiện, một cái gì đó như: def ev_datetime (tự): trở datetime.datetime.combine (self.event_date, self.start) nhưng sau đó tôi không thể làm .filter truy vấn (event__ev_datetime__gt = bây giờ). Đó là vấn đề của tôi về cơ bản. – freethrow

Trả lời

9

Thay vào đó hãy sử dụng DateTimeField (xem this section trong tài liệu). Chuyển đổi sang một số datetime.datetime được xử lý tự động cho bạn bởi Django.

A DateField kết quả trong một datetime.date và đối tượng datetime.time. Bạn có thể sử dụng replace sáp nhập các giá trị vào một cập nhật date:

 
>>> today = datetime.datetime.today() 
>>> today 
datetime.datetime(2012, 3, 31, 11, 6, 5, 182371) 
>>> time = datetime.time(11, 30) 
>>> today.replace(hour=time.hour, minute=time.minute) 
datetime.datetime(2012, 3, 31, 11, 30, 5, 182371) 

Lưu ý rằng kết quả date có 11,30 như thời gian bây giờ. Cũng lưu ý rằng today không được sửa đổi, nó chỉ đơn giản tính toán ngày và giờ mới. Như bạn có thể thấy, bây giờ bạn phải tự mình hợp nhất vì cả hai giá trị được lưu trữ trong các trường riêng biệt. Đó là lý do tại sao một DateTimeField là lựa chọn tốt hơn nhiều, nếu bạn có khả năng sửa đổi các trường của mô hình.

4

Bạn nên thêm trường mới như trường ngày giờ kết hợp. Tốt hơn cho hiệu suất.

event_full_datetime = models.DateTimeField() 

sửa cơ sở dữ liệu cũ. cho vỏ như tập lệnh này.

for obj in YourModel.objects.all(): 
    obj.event_full_datetime = datetime.datetime(obj.event_date.year,obj.event_date.month, obj.event_date.day, obj.event_time.hour, obj.event_time.minut, obj.event_time.second) 
    obj.save() 
Các vấn đề liên quan