Saya ingin mengubah nama bidang tertentu dalam model:
class Foo(models.Model):
name = models.CharField()
rel = models.ForeignKey(Bar)
harus berubah menjadi:
class Foo(models.Model):
full_name = models.CharField()
odd_relation = models.ForeignKey(Bar)
Apa cara termudah untuk melakukan ini menggunakan Selatan?
python
django
django-models
django-south
Jonathan
sumber
sumber
Jawaban:
Anda dapat menggunakan
db.rename_column
fungsi ini.Argumen pertama
db.rename_column
adalah nama tabel, jadi penting untuk mengingat bagaimana Django membuat nama tabel :Dalam kasus di mana Anda memiliki nama model multi-kata, berhuruf unta, seperti ProjectItem, nama tabel akan menjadi
app_projectitem
(yaitu, garis bawah tidak akan disisipkan di antaraproject
danitem
meskipun mereka adalah camel-cased).sumber
Inilah yang saya lakukan:
myapp/models.py
)./manage.py schemamigration myapp renaming_column_x --auto
Catatan
renaming_column_x
dapat berupa apa saja yang Anda suka, itu hanya cara memberikan nama deskriptif ke file migrasi.Ini akan menghasilkan Anda file yang disebut
myapp/migrations/000x_renaming_column_x.py
yang akan menghapus kolom lama Anda dan menambahkan kolom baru.Ubah kode dalam file ini untuk mengubah perilaku migrasi menjadi ganti nama sederhana:
sumber
x
ataucolumn_x
?--auto
migrasi terlebih dahulu adalah tip yang bagus. Ini menghindari masalah dengan FreeM ORM Selatan, yang terjadi jika migrasi hanya memilikiforwards
danbackwards
metode, tetapi tidak mengandungmodel
objek beku .db.rename_column
tidak mengubah nama batasan yang terkait dengan kolom. Migrasi masih akan berfungsi tetapi Anda akan memiliki kendala dinamai setelah nama kolom yang lama. Saya memiliki kolom dengan kendala keunikan, menamainya menggunakan metode ini, menguji bahwa kendala keunikan masih ada dan mendapat kesalahan tetapi nama kendala itu sendiri masih menggunakan nama kolom yang lama. Mungkin eksplisitdb.delete_unique
dandb.create_unique
akan melakukannya tetapi saya memutuskan untuk pergi dengan solusi sjh.Saya tidak tahu tentang kolom db.rename, kedengarannya mudah, namun di masa lalu saya telah menambahkan kolom baru sebagai satu schemamigration, kemudian membuat datamigration untuk memindahkan nilai ke bidang baru, lalu schemamigration kedua untuk menghapus kolom lama
sumber
db.rename_column
tidak akan mengubah nama batasan untuk Anda sehingga Anda harus mengatasinya secara manual. Jika Anda lupa melakukannya, migrasi akan berfungsi kecuali jika tanpa sepengetahuan Anda mungkin ada kendala masih menggunakan nama kolom yang lama. Tidak jelas bagi saya apakah masalahnya hanya kosmetik atau apakah dalam migrasi di masa depan di mana kendala harus dimanipulasi atau dijatuhkan Selatan tidak akan dapat menemukannya. Bagaimanapun, melakukannya di sini seperti yang disarankan sjh adalah cara yang aman untuk melakukannya: Anda dapat membiarkan Selatan mencari tahu apa yang harus dipikirkan.Django 1.7 memperkenalkan Migrasi jadi sekarang Anda bahkan tidak perlu menginstal paket tambahan untuk mengelola migrasi Anda.
Untuk mengganti nama model Anda, Anda perlu membuat migrasi kosong terlebih dahulu:
Maka Anda perlu mengedit kode migrasi Anda seperti ini:
Dan setelah itu Anda perlu menjalankan:
sumber
Cukup ganti model dan jalankan
makemigrations
di 1.9Django secara otomatis mendeteksi bahwa Anda telah menghapus dan membuat satu bidang, dan bertanya:
Katakan ya, dan migrasi yang tepat akan dibuat. Sihir.
sumber
south
ke aplikasi yang Anda instal dalam file pengaturan proyek.$ manage.py Schemamigration <app_name> --initial
$ manage.py migrate <app_name> --Fake
$ manage.py Schemamigration --auto
$ manage.py migrate <app_name>
Jika Anda menggunakan 'pycharm', maka Anda dapat menggunakan 'ctrl + shift + r' alih-alih 'manage.py', dan 'shift' untuk parameter.
sumber