ฟิลด์ใด ๆ ที่มีauto_nowชุดแอตทริบิวต์จะสืบทอดeditable=Falseและดังนั้นจะไม่ปรากฏในแผงการดูแลระบบ ได้มีการพูดคุยในอดีตเกี่ยวกับการทำauto_nowและauto_now_addการขัดแย้งหายไปและแม้ว่าพวกเขาจะยังคงอยู่ผมรู้สึกว่าคุณดีเพียงใช้กำหนดเองsave()วิธีการ
ดังนั้นเพื่อให้การทำงานนี้ถูกต้องฉันขอแนะนำไม่ให้ใช้auto_nowหรือauto_now_addและกำหนดsave()วิธีการของคุณเองเพื่อให้แน่ใจว่าcreatedมีการอัปเดตหากidไม่ได้ตั้งค่าไว้เท่านั้น (เช่นเมื่อรายการถูกสร้างขึ้นครั้งแรก) และอัปเดตmodifiedทุกครั้งที่มีรายการ ถูกบันทึก
ฉันทำสิ่งเดียวกันกับโครงการอื่น ๆ ที่ฉันเขียนโดยใช้ Django และคุณsave()จะมีลักษณะเช่นนี้:
from django.utils import timezone
class User(models.Model):
created = models.DateTimeField(editable=False)
modified = models.DateTimeField()
def save(self, *args, **kwargs):
''' On save, update timestamps '''
if not self.id:
self.created = timezone.now()
self.modified = timezone.now()
return super(User, self).save(*args, **kwargs)
หวังว่านี่จะช่วยได้!
แก้ไขเพื่อตอบสนองต่อความคิดเห็น:
เหตุผลที่ฉันเพิ่งติดการโหลดมากไปsave()เทียบกับการใช้อาร์กิวเมนต์ฟิลด์เหล่านี้คือสองเท่า:
- ขึ้นและลงดังกล่าวข้างต้นด้วยความน่าเชื่อถือของพวกเขา ข้อโต้แย้งเหล่านี้ขึ้นอยู่กับวิธีการของฐานข้อมูลแต่ละประเภทที่ Django รู้วิธีการโต้ตอบกับการปฏิบัติต่อเขตข้อมูลประทับวันที่ / เวลาและดูเหมือนว่าจะทำลายและ / หรือเปลี่ยนแปลงระหว่างการเปิดตัวทุกครั้ง (ซึ่งฉันเชื่อว่าเป็นแรงผลักดันที่อยู่เบื้องหลังการโทรเพื่อให้ลบออกไปโดยสิ้นเชิง)
- ข้อเท็จจริงที่ว่าพวกเขาทำงานบน DateField, DateTimeField และ TimeField เท่านั้นและด้วยการใช้เทคนิคนี้คุณจะสามารถเติมฟิลด์ประเภทใดก็ได้โดยอัตโนมัติทุกครั้งที่มีการบันทึกรายการ
- ใช้
django.utils.timezone.now()กับdatetime.datetime.now()เพราะมันจะกลับ TZ ทราบหรือไร้เดียงสาวัตถุขึ้นอยู่กับdatetime.datetimesettings.USE_TZ
เพื่อที่จะอธิบายว่าเหตุใด OP จึงเห็นข้อผิดพลาดฉันไม่ทราบแน่ชัด แต่ดูเหมือนcreatedว่าไม่ได้มีการเติมข้อมูลเลยแม้แต่auto_now_add=Trueน้อย สำหรับฉันมันโดดเด่นเป็นข้อบกพร่องและขีดรายการ # 1 ในรายการเล็ก ๆ ของฉันด้านบน: auto_nowและauto_now_addไม่สม่ำเสมอที่ดีที่สุด