ฟิลด์ใด ๆ ที่มี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.datetime
settings.USE_TZ
เพื่อที่จะอธิบายว่าเหตุใด OP จึงเห็นข้อผิดพลาดฉันไม่ทราบแน่ชัด แต่ดูเหมือนcreated
ว่าไม่ได้มีการเติมข้อมูลเลยแม้แต่auto_now_add=True
น้อย สำหรับฉันมันโดดเด่นเป็นข้อบกพร่องและขีดรายการ # 1 ในรายการเล็ก ๆ ของฉันด้านบน: auto_now
และauto_now_add
ไม่สม่ำเสมอที่ดีที่สุด