Saya memiliki model db di bawah ini:
from datetime import datetime
class TermPayment(models.Model):
# I have excluded fields that are irrelevant to the question
date = models.DateTimeField(default=datetime.now(), blank=True)
Saya menambahkan contoh baru dengan menggunakan di bawah ini:
tp = TermPayment.objects.create(**kwargs)
Masalah saya: semua catatan dalam basis data memiliki nilai yang sama di bidang tanggal, yang merupakan tanggal pembayaran pertama. Setelah server dimulai ulang, satu catatan memiliki tanggal baru dan catatan lainnya memiliki yang sama dengan yang pertama. Sepertinya beberapa data di-cache, tetapi saya tidak dapat menemukan di mana.
database: mysql 5.1.25
django v1.1.1
default=datetime.now
- note, tanpa memanggil seperti dalamnow()
Bukan standar untuk DateTimeField, tapi ... berguna anycase.Jawaban:
sepertinya
datetime.now()
sedang dievaluasi saat model didefinisikan, dan tidak setiap kali Anda menambahkan catatan.Django memiliki fitur untuk mencapai apa yang sudah Anda coba lakukan:
atau
Perbedaan antara contoh kedua dan apa yang saat ini Anda miliki adalah kurangnya tanda kurung. Dengan melewati
datetime.now
tanpa tanda kurung, Anda melewati fungsi sebenarnya, yang akan dipanggil setiap kali catatan ditambahkan. Jika Anda melewatinyadatetime.now()
, maka Anda hanya mengevaluasi fungsi dan meneruskannya nilai pengembalian.Informasi lebih lanjut tersedia di referensi bidang model Django
sumber
expiry = models.DateTimeField(default=datetime.now + timedelta(days=30))
def now_plus_30(): return datetime.now() + timedelta(days = 30)
, dan kemudian menggunakanmodels.DateTimeField(default=now_plus_30)
default=lambda: datetime.now()+timedelta(days=30)
Alih-alih menggunakan
datetime.now
Anda harus benar-benar menggunakanfrom django.utils.timezone import now
Referensi:
django.utils.timezone.now
jadi lakukan sesuatu seperti ini:
sumber
auto_now_add
(yang sadar zona waktu), Anda bisa mendapatkan perhitungan yang salah karena ada perbedaan zona waktu.Dari dokumentasi pada bidang standar model Django:
Nilai default untuk bidang. Ini bisa berupa nilai atau objek yang bisa dipanggil. Jika bisa dipanggil itu akan dipanggil setiap kali objek baru dibuat.
Oleh karena itu berikut ini harus berfungsi:
sumber
default
( django-chinese-docs-14.readthedocs.io/en/latest/ref/models/… )David memiliki jawaban yang tepat. Tanda kurung () membuatnya sehingga callable timezone.now () dipanggil setiap kali model dievaluasi. Jika Anda menghapus () dari timezone.now () (atau datetime.now (), jika menggunakan objek datetime yang naif) untuk membuatnya seperti ini:
Maka itu akan berfungsi seperti yang Anda harapkan:
Objek baru akan menerima tanggal saat ini ketika mereka dibuat, tetapi tanggal tidak akan ditimpa setiap kali Anda mengelola. Migrasi / migrasi.
Saya baru saja menemukan ini. Terima kasih banyak untuk David.
sumber
Itu
datetime.now()
dievaluasi ketika kelas dibuat, bukan ketika catatan baru sedang ditambahkan ke database.Untuk mencapai apa yang Anda inginkan, tentukan bidang ini sebagai:
Dengan cara ini
date
bidang akan ditetapkan ke tanggal saat ini untuk setiap catatan baru.sumber
Jawabannya sebenarnya salah.
Mengisi nilai secara otomatis (auto_now / auto_now_add tidak sama dengan default). Nilai default sebenarnya akan menjadi apa yang dilihat pengguna jika itu adalah objek baru. Apa yang biasanya saya lakukan adalah:
Pastikan, jika Anda mencoba mewakili ini di halaman Admin, Anda mencantumkannya sebagai 'read_only' dan merujuk nama bidang
Sekali lagi, saya melakukan ini karena nilai default saya biasanya tidak dapat diedit, dan halaman Admin mengabaikan yang tidak dapat diedit kecuali ditentukan lain. Namun ada perbedaan antara pengaturan nilai default dan penerapan auto_add yang merupakan kunci di sini. Uji itu!
sumber
datetime.now()
sedang dievaluasi sekali, ketika kelas Anda dipakai. Coba hapus tanda kurung sehingga fungsidatetime.now
dikembalikan dan MAKA dievaluasi. Saya memiliki masalah yang sama dengan pengaturan nilai default untukDateTimeField
dan menulis solusi saya di sini .sumber
Dari referensi bahasa Python, di bawah Definisi fungsi :
Untungnya, Django memiliki cara untuk melakukan apa yang Anda inginkan, jika Anda menggunakan
auto_now
argumen untukDateTimeField
:Lihat dokumen Django untuk DateTimeField .
sumber
Dalam Django 3.0
auto_now_add
sepertinya bekerja denganauto_now
reg_date=models.DateField(auto_now=True,blank=True)
sumber