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

  • DudeFromUkraine

    DudeFromUkra

    7 Ocak 2008
  • iMasterful

    iMasterful

    11 EYLÜL 2009
  • World Science Festival

    World Scienc

    1 Mayıs 2008