SORU
19 Mayıs 2010, ÇARŞAMBA


Kolay bir model Django kullanarak yeniden adlandır/Güney yolu?

Güney sitesi, Google'da bu bir cevap, ve bu YÜZDEN onu aradım, ama bunu yapmak için basit bir yol bulamadı.

Django model Güney kullanarak yeniden adlandırmak istiyorum. Aşağıdaki:

class Foo(models.Model):
    name = models.CharField()

class FooTwo(models.Model):
    name = models.CharField()
    foo = models.ForeignKey(Foo)

Bar Foo dönüştürmek için, yani seni istiyorum

class Bar(models.Model):
    name = models.CharField()

class FooTwo(models.Model):
    name = models.CharField()
    foo = models.ForeignKey(Bar)

Basit tutmak için, sadece Bar Foo adını değiştirmek ama şimdilik FooTwo 9 *üye aldırmamaya çalışıyorum.

Bu kullanarak Güney yapmak için en kolay yolu nedir?

  1. Muhtemelen veri geçiş yapabilirim, ama çok karmaşık görünüyor.
  2. Özel bir geçiş yazmak, örneğin db.rename_table('city_citystate', 'geo_citystate') ama bu durumda yabancı anahtar düzeltmek için nasıl emin değilim.
  3. Bildiğiniz daha kolay bir yol?

CEVAP
24 Mayıs 2010, PAZARTESİ


İlk sorunun cevabı, basit model/tablo yeniden adlandırmak oldukça basittir. Komutu çalıştırın:

./manage.py schemamigration yourapp rename_foo_to_bar --empty

(Güncelleme 2: --empty yerine --auto uyarı aşağıda kaçınıyorum. @Tavsiyen için teşekkürler KFB.)

Eğer Güney eski bir sürümünü kullanıyorsanız, schemamigration yerine startmigration gerekir.

Daha sonra el ile geçiş dosyası bu gibi görünüyor için düzenleyin

class Migration(SchemaMigration):

    def forwards(self, orm):
        db.rename_table('yourapp_foo', 'yourapp_bar')


    def backwards(self, orm):
        db.rename_table('yourapp_bar','yourapp_foo')   

Bu daha basit bir model sınıf db_table Meta seçeneğini kullanarak gerçekleştirebilirsiniz. Ama her zaman, kilo kodunuzu anlamak ve korumak için daha zor hale getirir mirası artırmak bunu. Ben tam netlik için böyle basit refactorings destek yapıyor.

(update) sadece üretimde bu denenmiş ve geçiş uygulamak için gittiğimde garip bir uyarı var. O dedi ki:

The following content types are stale and need to be deleted:

    yourapp | foo

Any objects related to these content types by a foreign key will also
be deleted. Are you sure you want to delete these content types?
If you're unsure, answer 'no'.

"Hayır" ve her şey yolunda görünüyordu. cevap verdim

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • parlophone

    parlophone

    28 ŞUBAT 2006
  • SalGames2016

    SalGames2016

    17 Kasım 2012
  • thewinekone

    thewinekone

    17 Aralık 2005