2012-11-05 31 views
12

Vấn đề này đã xảy ra trong và tắt trong một vài tuần nay, và nó không giống như bất kỳ mà đã đưa ra dự án của tôi.Django default = timezone.now() lưu hồ sơ bằng cách sử dụng "cũ" thời gian

Hai trong số các mô hình được sử dụng có trường dấu thời gian, theo mặc định được đặt là timezone.now().

Đây là chuỗi làm tăng cờ lỗi:


  • mẫu một được tạo ra lúc 07:30

  • Mẫu hai được tạo ra lúc 22:00, nhưng trong cơ sở dữ liệu MySQL được lưu trữ lúc 7:30 tối!

Mỗi mô hình được tạo có tem thời gian của mình lưu dưới 19:30, không phải là thời gian thực tế, cho đến một thời gian nhất định đi. Sau đó một thời gian mới được thiết lập và tất cả các mô hình sau có thời gian mới ... Bizzare


Một số chi tiết phụ trợ có thể giúp đỡ trong việc khám phá ra vấn đề:

tôi có một loạt các phương pháp mà tôi sử dụng để dải thời gian của tôi của tzinfo của họ và thay thế chúng bằng UTC.

Điều này là do tôi đang thực hiện phép tính timezone.now() - creationTime để tạo: "mô hình đã được đăng từ lâu" tính năng trong dự án. Tuy nhiên, điều này thực sự không phải là nguyên nhân của vấn đề.

Tôi không nghĩ rằng việc sử dụng datetime.datetime.now() cũng sẽ tạo ra bất kỳ sự khác biệt nào.

Dù sao, cảm ơn sự giúp đỡ!

+1

Tôi đặt cược vấn đề "được sửa" cho bản ghi đầu tiên * sau * quá trình máy chủ khởi động lại (và có lẽ chỉ/tất cả các bản ghi mới được chèn vào cùng một phút của khởi động lại máy chủ). Vui lòng hiển thị mã sử dụng/bộ/thiết lập giá trị mặc định này. Tôi nghi ngờ rằng nó chỉ được đánh giá * một lần * (khi bản ghi đầu tiên được tạo) và không được cập nhật cho các bản ghi tiếp theo. –

+0

Dự đoán của bạn là chính xác! Điều gì làm cho bạn nghĩ điều này và tại sao nó sẽ xảy ra? –

Trả lời

44

Chỉ cần chạy vào tuần trước cho một trường có default=date.today(). Nếu bạn loại bỏ các dấu ngoặc đơn (trong trường hợp này, hãy thử default=timezone.now) sau đó bạn đang chuyển một cuộc gọi đến mô hình và nó sẽ được gọi mỗi khi một cá thể mới được lưu. Với các dấu ngoặc đơn, nó chỉ được gọi một lần khi models.py tải.

+1

Điều này rất tuyệt, cảm ơn phản hồi. Các chức năng vượt qua là khá gây hiểu nhầm vì kể từ khi bắt đầu với django như là một amateaur, mỗi hướng dẫn duy nhất mà tôi đã đọc và những cuốn sách, ngay cả tất cả đã có datetime.datetime.now() hoặc timezone.now() được đặt làm mặc định cho dấu thời gian, nó chỉ trở thành một cái gì đó tôi đã thực hiện tự động cho tất cả các dấu thời gian của tôi! –

+0

Tôi cho rằng làm sai theo cách này sẽ xuất hiện để hoạt động nếu bạn chỉ triển khai các ứng dụng Django của bạn với CGI cũ kỹ; và tất nhiên bạn phải kiểm tra trong một khoảng thời gian hoặc vài ngày để nhận thấy những dấu thời gian này không cập nhật ... Nhưng nếu đây là lời khuyên phổ biến, nó không cho tôi sự tự tin trong thử nghiệm của các tác giả đó. : -/ –

+3

Tôi không chắc những ví dụ nào sẽ gợi ý gọi 'datetime.now()'. Vào thời điểm hàm trường nhận được đối số đó, nó chỉ là một đối tượng datetime. –

7

Chỉ cần đặt tham số auto_now_add như thế này.

timestamp = models.DateTimeField(auto_now_add=True) 

Cập nhật:

Xin đừng dùng auto_now_add. Đây không phải là cách được đề xuất, thay vì làm như vậy:

from django.utils import timezone 

timestamp = models.DateTimeField(default=timezone.now) 
+1

Đây không còn là phương pháp ưu tiên để hoàn thành việc này. [Không được chấp nhận] (https://code.djangoproject.com/ticket/22995) – davelupt

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