Untuk Django 1.1.
Saya memilikinya di models.py saya:
class User(models.Model):
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
Saat memperbarui baris saya mendapatkan:
[Sun Nov 15 02:18:12 2009] [error] /home/ptarjan/projects/twitter-meme/django/db/backends/mysql/base.py:84: Warning: Column 'created' cannot be null
[Sun Nov 15 02:18:12 2009] [error] return self.cursor.execute(query, args)
Bagian yang relevan dari database saya adalah:
`created` datetime NOT NULL,
`modified` datetime NOT NULL,
Apakah ini memprihatinkan?
Pertanyaan sampingan: di alat admin saya, kedua bidang itu tidak muncul. Apakah itu diharapkan?
python
django
datetime
django-models
django-admin
Paul Tarjan
sumber
sumber
update()
metode tidak akan memanggilsave()
yang berarti tidak bisa memperbaruimodified
bidang secara otomatisJawaban:
Setiap bidang dengan
auto_now
set atribut juga akan mewarisieditable=False
dan karenanya tidak akan muncul di panel admin. Telah ada pembicaraan di masa lalu tentang membuatauto_now
danauto_now_add
argumen hilang, dan meskipun masih ada, saya merasa Anda lebih baik hanya menggunakan metode kustomsave()
.Jadi, untuk membuat ini berfungsi dengan baik, saya akan merekomendasikan untuk tidak menggunakan
auto_now
atauauto_now_add
dan sebaliknya mendefinisikansave()
metode Anda sendiri untuk memastikan bahwacreated
hanya diperbarui jikaid
tidak disetel (seperti ketika item pertama kali dibuat), dan minta pembaruanmodified
setiap kali item disimpan.Saya telah melakukan hal yang sama persis dengan proyek lain yang saya tulis menggunakan Django, dan Anda
save()
akan terlihat seperti ini:Semoga ini membantu!
Edit dalam menanggapi komentar:
Alasan mengapa saya bertahan dengan kelebihan beban
save()
vs mengandalkan argumen lapangan ini adalah dua kali lipat:django.utils.timezone.now()
vs.datetime.datetime.now()
, karena akan mengembalikan objek TZ-aware atau naifdatetime.datetime
tergantungsettings.USE_TZ
.Untuk mengatasi mengapa OP melihat kesalahan, saya tidak tahu persis, tetapi sepertinya
created
bahkan tidak diisi sama sekali, meskipun sudahauto_now_add=True
. Bagi saya itu menonjol sebagai bug, dan menggarisbawahi item # 1 dalam daftar kecil saya di atas:auto_now
dan palingauto_now_add
tidak terkelupas.sumber
save()
pada masing-masing model saya jauh lebih menyakitkan daripada menggunakanauto_now
(karena saya ingin memiliki bidang ini pada semua model saya). Mengapa param itu tidak berfungsi?Tetapi saya ingin menunjukkan bahwa pendapat yang diungkapkan dalam jawaban yang diterima agak ketinggalan jaman. Menurut diskusi yang lebih baru (bug Django # 7634 dan # 12785 ), auto_now dan auto_now_add tidak ke mana-mana, dan bahkan jika Anda pergi ke diskusi asli , Anda akan menemukan argumen yang kuat terhadap RY (seperti pada KERING) di penyimpanan kustom metode.
Solusi yang lebih baik telah ditawarkan (jenis bidang khusus), tetapi tidak mendapatkan momentum yang cukup untuk membuatnya menjadi Django. Anda dapat menulis sendiri dalam tiga baris (ini saran Yakub Kaplan-Moss ).
sumber
Berbicara tentang pertanyaan sampingan: jika Anda ingin melihat bidang ini di admin (meskipun, Anda tidak akan dapat mengeditnya), Anda dapat menambahkan
readonly_fields
ke kelas admin Anda.Yah, ini hanya berlaku untuk versi Django terbaru (saya percaya, 1.3 dan di atas)
sumber
XxAdmin
kelas. Saya membacanya terlalu cepat dan mencoba menambahkannya ke kelas sayaAdminForm
atauModelForm
dan tidak tahu mengapa mereka tidak menerjemahkan "bidang baca saja". BTW, apakah ada kemungkinan untuk memiliki "bidang baca-saja yang benar dalam formulir?Saya pikir solusi termudah (dan mungkin paling elegan) di sini adalah untuk memanfaatkan fakta bahwa Anda dapat mengatur
default
panggilan. Jadi, untuk menyiasati penanganan khusus admin auto_now, Anda bisa mendeklarasikan bidang seperti ini:Penting bahwa Anda tidak menggunakan
timezone.now()
karena nilai default tidak akan diperbarui (yaitu, standar hanya akan ditetapkan ketika kode dimuat). Jika Anda sering melakukan hal ini, Anda bisa membuat bidang khusus. Namun, saya pikir ini sudah KERING.sumber
makemigrations
, menafsirkan standar sebagai waktu ketika Anda menjalankannyamakemigrations
, dan karenanya berpikir bahwa nilai default telah berubah!default=timezone.now()
dan bukan apa yang disarankan:default=timezine.now
(tidak ada tanda kurung)?Jika Anda mengubah kelas model Anda seperti ini:
Maka bidang ini akan muncul di halaman perubahan admin saya
sumber
python manage.py makemigrations
: KeyError: u'editable 'Berdasarkan apa yang saya baca dan pengalaman saya dengan Django sejauh ini, auto_now_add buggy. Saya setuju dengan jthanism --- menimpa metode save normal itu bersih dan Anda tahu apa yang terjadi. Sekarang, untuk membuatnya kering, buat model abstrak yang disebut TimeStamped:
Dan kemudian, ketika Anda menginginkan model yang memiliki perilaku time-stampy ini, cukup subkelas:
Jika Anda ingin bidang ditampilkan di admin, maka hapus saja
editable=False
opsisumber
timezone.now()
yang kamu gunakan di sini? Saya berasumsidjango.utils.timezone.now()
, tapi saya tidak positif. Juga, mengapa menggunakantimezone.now()
bukandatetime.datetime.now()
?timezone.now()
adalah karena sadar akan zona waktu, sedangkandatetime.datetime.now()
zona waktu itu naif. Anda dapat membacanya di sini: docs.djangoproject.com/en/dev/topics/i18n/timezonesdefault=timezone.now
di dalam konstruktor bidang?update_fields
arg disediakan dan 'last_modified' tidak ada dalam daftar, saya akan menambahkan:if 'update_fields' in kwargs and 'last_modifed' not in kwargs['update_fields']: kwargs['update_fields'].append('last_modified')
Tidak, Django secara otomatis menambahkannya untuk Anda saat menyimpan model, jadi, itu diharapkan.
Karena bidang ini ditambahkan secara otomatis, bidang tersebut tidak ditampilkan.
Untuk menambahkan hal di atas, seperti yang dikatakan synack, telah ada perdebatan di milis Django untuk menghapus ini, karena, itu "tidak dirancang dengan baik" dan "hack"
Jelas Anda tidak perlu menulisnya untuk setiap model. Anda dapat menulisnya ke satu model dan mewarisi yang lain dari itu.
Tetapi, sebagaimana ada
auto_add
dan diauto_now_add
sana, saya akan menggunakannya daripada mencoba menulis metode sendiri.sumber
Saya membutuhkan sesuatu yang serupa hari ini di tempat kerja. Nilai default menjadi
timezone.now()
, tetapi dapat diedit di tampilan admin dan kelas yang diwarisiFormMixin
, jadi untuk dibuat dalammodels.py
kode saya berikut memenuhi persyaratan:Untuk
DateTimeField
, saya kira hapus.date()
dari fungsi dan ubahdatetime.date
kedatetime.datetime
atau lebih baiktimezone.datetime
. Saya belum mencobanya denganDateTime
, hanya denganDate
.sumber
Anda dapat menggunakan
timezone.now()
untuk dibuat danauto_now
dimodifikasi:Jika Anda menggunakan kunci utama khusus alih-alih default
auto- increment int
,auto_now_add
akan menyebabkan bug.Berikut adalah kode DateTimeField.pre_save default Django dengan
auto_now
danauto_now_add
:Saya tidak yakin apa parameternya
add
. Saya harap ini akan seperti:sumber
Sedangkan untuk tampilan Admin Anda, lihat jawaban ini .
Catatan:
auto_now
danauto_now_add
diatureditable=False
secara default, itulah sebabnya ini berlaku.sumber
auto_now=True
tidak bekerja untuk saya di Django 1.4.1, tetapi kode di bawah ini menyelamatkan saya. Ini untuk datetime sadar zona waktu.sumber
Di sini, kami telah membuat dan memperbarui kolom yang akan memiliki cap waktu ketika dibuat, dan ketika seseorang mengubah umpan balik.
auto_now_add akan mengatur waktu ketika sebuah instance dibuat sedangkan auto_now akan mengatur waktu ketika seseorang mengubah umpan baliknya.
sumber
Inilah jawabannya jika Anda menggunakan selatan dan Anda ingin default ke tanggal Anda menambahkan bidang ke database:
Pilih opsi 2 lalu: datetime.datetime.now ()
Terlihat seperti ini:
sumber