Saya tahu bahwa dari Django 1.7 saya tidak perlu menggunakan Selatan atau sistem migrasi lainnya, jadi saya hanya menggunakan perintah sederhana python manage.py makemigrations
Namun, yang saya dapatkan hanyalah kesalahan ini:
You are trying to add a non-nullable field 'new_field' to userprofile without a default;
we can't do that (the database needs something to populate existing rows).
Berikut adalah models.py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
new_field = models.CharField(max_length=140)
Apa sajakah pilihan?
Jawaban:
Anda perlu memberikan nilai default:
sumber
default = website
tidak melakukan pekerjaan itunew_field
kewebsite
.Jika Anda berada dalam siklus pengembangan awal dan tidak peduli dengan data database Anda saat ini, Anda dapat menghapusnya lalu bermigrasi. Tetapi pertama-tama Anda perlu membersihkan dir migrasi dan menghapus barisnya dari tabel (django_migrations)
sumber
mysql -u[user] [database] -e "delete from django_migrations where app=[your_app]"
__init__.py
migrasi dari, atau, Anda memulihkannya setelah itu, jika tidak, migrasi tidak akan berfungsi stackoverflow.com/a/46362750/1649917python manage.py sqlmigrate name_of_your_app nb_of_the_migration
juga diperlukanSalah satu opsinya adalah mendeklarasikan nilai default untuk 'new_field':
pilihan lain adalah mendeklarasikan 'new_field' sebagai bidang nullable:
Jika Anda memutuskan untuk menerima 'new_field' sebagai field nullable, Anda mungkin ingin menerima 'no input' sebagai input yang valid untuk 'new_field'. Kemudian Anda harus menambahkan
blank=True
pernyataan itu juga:Bahkan dengan
null=True
dan / ataublank=True
Anda dapat menambahkan nilai default jika perlu:sumber
Jika Anda berada di awal siklus pengembangan, Anda dapat mencoba ini -
Hapus / komentari model itu dan semua penggunaannya. Terapkan migrasi. Itu akan menghapus model itu dan kemudian menambahkan model itu lagi, menjalankan migrasi dan Anda memiliki model bersih dengan bidang baru ditambahkan.
sumber
Jika "situs web" bisa kosong maka
new_field
harus disetel menjadi kosong.Sekarang jika Anda ingin menambahkan logika pada save where if
new_field
is empty untuk mengambil nilai dari "website" yang perlu Anda lakukan adalah mengganti fungsi save untuk AndaModel
seperti ini:sumber
Jika ada yang menyetel
ForeignKey
, Anda bisa mengizinkan bidang nullable tanpa menyetel default:Jika Anda sudah memiliki data yang disimpan dalam database, Anda juga bisa menyetel nilai default:
sumber
Anda tidak dapat menambahkan referensi ke tabel yang sudah memiliki data di dalamnya.
Perubahan:
untuk:
melakukan:
ubah lagi:
lakukan migrasi lagi:
sumber
Dalam new_file tambahkan properti boolean null.
setelah Anda menjalankan
./manage.py syncdb
untuk menyegarkan DB. dan akhirnya Anda lari./manage.py makemigrations
dan./manage.py migrate
sumber
Anda dapat menggunakan metode dari Django Doc dari halaman ini https://docs.djangoproject.com/en/1.8/ref/models/fields/#default
Buat default dan gunakan
sumber
Apakah Anda sudah memiliki entri database di tabel
UserProfile
? Jika demikian, ketika Anda menambahkan kolom baru, DB tidak tahu harus mengaturnya karena tidak bisaNULL
. Oleh karena itu, ia menanyakan apa yang ingin Anda setel bidang tersebut di kolomnew_fields
. Saya harus menghapus semua baris dari tabel ini untuk menyelesaikan masalah.(Saya tahu ini telah dijawab beberapa waktu yang lalu, tetapi saya baru saja mengalami masalah ini dan ini adalah solusi saya. Semoga ini akan membantu siapa pun yang baru melihat ini)
sumber
Sejujurnya saya menemukan cara terbaik untuk menyiasati ini adalah dengan hanya membuat model lain dengan semua bidang yang Anda butuhkan dan diberi nama yang sedikit berbeda. Jalankan migrasi. Hapus model yang tidak digunakan dan jalankan migrasi lagi. Voila.
sumber
Jika Anda tidak keberatan memotong tabel model yang dimaksud, Anda dapat menentukan nilai default satu kali
None
di prompt. Migrasi akan menjadi berlebihandefault=None
sementara kode Anda tidak memiliki default. Ini dapat diterapkan dengan baik karena tidak ada lagi data dalam tabel yang memerlukan default.sumber
Saya masih awal dalam siklus pengembangan saya, jadi ini mungkin tidak berfungsi untuk semua orang (tetapi saya tidak mengerti mengapa tidak).
Saya menambahkan
blank=True, null=True
ke kolom di mana saya mendapatkan kesalahan. Lalu aku menjalankanpython manage.py makemigrations
perintah.Segera setelah menjalankan perintah ini (dan sebelum menjalankan
python manage.py migrate
), saya menghapusblank=True, null=True
dari semua kolom. Lalu aku laripython manage.py makemigrations
lagi. Saya diberi opsi untuk hanya mengubah kolom sendiri, yang saya pilih.Kemudian saya berlari
python manage.py migrate
dan semuanya bekerja dengan baik!sumber
Apa yang sebenarnya Django katakan adalah:
Jika Anda yakin bahwa tidak ada nilai dalam
userprofile
tabel yang NULL - bebas dan abaikan peringatan.Praktik terbaik dalam kasus seperti itu adalah membuat migrasi RunPython untuk menangani nilai kosong seperti yang dinyatakan dalam opsi 2
Dalam migrasi RunPython Anda harus menemukan semua
UserProfile
contoh dengannew_field
nilai kosong dan meletakkan nilai yang benar di sana (atau nilai default seperti yang diminta Django untuk Anda setel dalam model). Anda akan mendapatkan sesuatu seperti ini:Selamat bersenang-senang!
sumber
Di models.py
class UserProfile(models.Model): user = models.OneToOneField(User) website = models.URLField(blank=True) new_field = models.CharField(max_length=140, default="some_value")
Anda perlu menambahkan beberapa nilai sebagai default.
sumber
Jika SSH itu memberi Anda 2 pilihan, pilih nomor 1, dan masukkan "Tidak Ada". Hanya itu ... untuk saat ini.
sumber