2010-08-07 43 views
85

Cách tốt nhất để đặt ngày tạo đối tượng tự động là gì và cũng là trường sẽ ghi khi đối tượng được cập nhật lần cuối?Ngày tạo tự động cho các đối tượng mẫu django?

Trong mô hình của tôi, tôi có:

created_at = models.DateTimeField(False, True, editable=False) 
updated_at = models.DateTimeField(True, True, editable=False) 

và theo quan điểm của tôi:

if request.method == 'POST': 
    form = MyForm(request.POST) 
    if form.is_valid(): 
     obj = form.save(commit=False) 
     obj.user = request.user 
     obj.save() 
     return HttpResponseRedirect('obj_list') 

tôi nhận được lỗi:

objects_object.created_at may not be NULL 

Tôi có phải tự thiết lập giá trị này bản thân mình ? Tôi nghĩ đó là điểm của các tham số được truyền cho DateTimeFields (hoặc chúng chỉ mặc định và vì tôi đã đặt 'editable = False' chúng không được hiển thị trên biểu mẫu, do đó không được gửi trong yêu cầu và do đó không được đưa vào biểu mẫu?).

Cách tốt nhất để làm điều này là gì? Phương thức init?

Cảm ơn

ps - tôi là một django và Python newbie ...

Trả lời

184

Bạn có thể sử dụng các tùy chọn auto_nowauto_now_add cho updated_atcreated_at tương ứng.

class MyModel(models.Model): 
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True) 
+14

'auto_now' và' auto_now_add' được coi là xấu, vì vậy, hãy tránh chúng. [Câu trả lời] (http://stackoverflow.com/a/1737078/1226722) giải thích lý do tại sao và cung cấp cách tiếp cận tốt hơn, ghi đè phương thức 'save()'. – gregoltsov

+2

nó tạo ra lỗi này: 'Bạn đang cố gắng thêm trường không có giá trị 'created_at' vào bộ điều khiển trò chơi mà không có mặc định; chúng ta không thể làm điều đó (cơ sở dữ liệu cần một cái gì đó để cư trú các hàng hiện có). Vui lòng chọn sửa chữa: 1) Cung cấp mặc định một lần ngay bây giờ (sẽ được đặt trên tất cả các hàng hiện có) 2) Thoát và để tôi thêm mặc định trong models.py Chọn một tùy chọn: 1 Vui lòng nhập giá trị mặc định ngay bây giờ, như là hợp lệ Python Các mô-đun datetime và django.utils.timezone có sẵn, vì vậy bạn có thể làm ví dụ timezone.now() >>> timezone.now() ' –

+0

xóa các hàng trên databas hoặc chọn tùy chọn 1 và thêm timezone.now() – mullerivan

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