ใน django โมเดลมีฟิลด์เวลาประทับเริ่มต้นหรือไม่


91

ใน django - มีฟิลด์การประทับเวลาเริ่มต้นสำหรับวัตถุทั้งหมดหรือไม่ นั่นคือฉันต้องประกาศฟิลด์ 'การประทับเวลา' อย่างชัดเจนสำหรับ 'สร้างเมื่อ' ในโมเดลของฉันหรือมีวิธีที่จะทำให้สิ่งนี้เป็นไปโดยอัตโนมัติ?

คำตอบ:


178

ไม่มีสิ่งนั้นตามค่าเริ่มต้น แต่การเพิ่มสิ่งนั้นทำได้ง่ายมาก เพียงใช้auto_now_addพารามิเตอร์ในDateTimeFieldคลาส:

created = models.DateTimeField(auto_now_add=True)

คุณยังสามารถใช้auto_nowสำหรับฟิลด์ "อัปเดตเมื่อ" ตรวจสอบการทำงานของที่นี่auto_now

สำหรับauto_now_add ที่นี่ .

โมเดลที่มีทั้งสองช่องจะมีลักษณะดังนี้:

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

33

โดยอัตโนมัติไม่ได้ดูเหมือนสิ่งที่ django จะทำโดยค่าเริ่มต้น จะไม่บังคับให้คุณต้องมีการประทับเวลา

ฉันจะสร้างคลาสพื้นฐานที่เป็นนามธรรมและสืบทอดโมเดลทั้งหมดจากมันหากคุณไม่ต้องการลืมเกี่ยวกับการประทับเวลา / ชื่อฟิลด์ ฯลฯ

class TimeStampedModel(models.Model):
     created_on = models.DateTimeField(auto_now_add=True)

     class Meta:
         abstract = True

ดูเหมือนจะไม่ค่อยนำเข้าwherever.TimeStampedModelแทนdjango.db.models.Model

class MyFutureModels(TimeStampedModel):
    ....

2
นอกจากนี้ยังมีmodel_utilsDjango ที่มีอยู่แล้วTimeStampedModelแต่ถ้าคุณไม่ต้องการสิ่งอื่นใดจากแพ็คเกจนี้เพียงแค่ให้น้ำหนักเพิ่ม
boldnik

@boldnik ฉันเป็นแฟนของความเรียบง่าย
Yuji 'Tomita' Tomita

เจ๋งทีเดียว... ฉันมี 3 คลาสที่ต้องมีการประทับเวลาสำหรับcreatedและ updatedนี่เป็นวิธีที่ดีในการทำอย่างสะอาด
ron_g

13

หากคุณใช้django-extensions (ซึ่งเป็นแอพที่ดีสำหรับการเพิ่มฟังก์ชันให้กับตัวช่วยบรรทัดคำสั่ง django-admin.py) คุณสามารถรับฟิลด์โมเดลเหล่านี้ได้ฟรีโดยรับช่วงจากTimeStampedModelหรือใช้ฟิลด์ TimeStamp ที่กำหนดเอง


5

คุณสามารถลองdjango-extensions

หากคุณต้องการใช้แบบจำลองนามธรรมประทับเวลา

from django_extensions.db.models import TimeStampedModel

class A(TimeStampedModel):
   ...

มันมีแบบจำลองนามธรรมอื่น ๆ คุณสามารถใช้มันได้เช่นกัน


2

หากคุณต้องการแก้ไขฟิลด์นี้ให้ตั้งค่าต่อไปนี้แทน auto_now_add=True:

สำหรับวันที่

from datetime import date

models.DateField(default=date.today)

สำหรับ DateTime

from django.utils import timezone

models.DateTimeField(default=timezone.now)

0

ฉันคิดว่าฉันจะไปด้วย

created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

ฉันต้องการคำชี้แจงเกี่ยวกับการใช้

class TimeStampedModel(models.Model):
    created_on = models.DateTimeField(auto_now_add=True)

    class Meta:
         abstract = True
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.