Django / South istifadə modelini adlandırmanın ən asan yolu?

Mən Cənubi, Google və SO-də cavab axtarıram, amma bunu asan bir yol tapa bilmədi.

Cənubi istifadə edərək Django modelini yenidən adlandırmaq istəyirəm. Gəlin aşağıdakıları söyləyin:

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

və foo-nu bara çevirmək istəyirsən

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

Sadə etmək üçün Foo dan Bar adını dəyişdirməyə çalışıram, amma indi FooTwo Foo üzvünü FooTwo .

Cənubın köməyi ilə bunu etmək üçün ən asan yol nədir?

  • Bəlkə də məlumat köçünü edə bilərəm amma bu olduqca cazibədar görünür.
  • Məsələn, xüsusi bir miqrasiya yazın. db.rename_table('city_citystate', 'geo_citystate') , amma bu halda xarici düyməni necə düzəltməyinizə əmin deyiləm.
  • Bilirsiniz daha asan bir yol?
138
19 мая '10 в 8:02 2010-05-19 08:02 vaughnkoch 19 may 2010-da saat 08:02 da verilmişdir . 2010-05-19 08:02
@ 4 cavab

İlk sualınıza cavab vermək üçün sadəcə modelin / masanın dəyişdirilməsi çox sadədir. Komandanı çalıştırın:

 ./manage.py schemamigration yourapp rename_foo_to_bar --empty 

(Update 2: əvəzinə - --empty əvəzinə aşağıda göstərilən xəbərdarlıqdan qaçınmaq üçün cəhd edin. Bir işarə üçün @KFB sayəsində.)

startmigration köhnə bir versiyasını istifadə edirsinizsə, startmigration əvəzinə startmigration tələb schemamigration .

Sonra belə bir şəkildə görünmək üçün köç faylını əl ilə düzəliş edin:

 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') 

Model sinifində db_table Meta variantını istifadə edərək bunu daha asan edə bilərsiniz. Bununla yanaşı, hər dəfə bunu kodbazınızın miraslaşdırılmış çəkisini artırırsınız - əgər sinif adları masa adlarından fərqli olsa, kodunuz anlamaq və saxlamaq üçün daha da çətin olur. Mən aydınlıq üçün bu cür sadə refactorings etmək tam dəstəkləyir.

(yeniləmə) Mən yalnız iş yerində çalışdım və köçməyə müraciət etmək üçün qəribə bir xəbərdarlıq aldım. O dedi:

 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'. 

Mən dedim və hər şey yaxşı idi.

128
24 мая '10 в 21:07 2010-05-24 21:07 cavab Mayın 24-də saat 21:07 'də Leopd tərəfindən verildi 2010-05-24 21:07

models.py dəyişiklikləri edin və sonra models.py

 ./manage.py schemamigration --auto myapp 

Miqrasiya faylını yoxladığınızda, masanın silindiyini və yenisini yaratdığını görəcəksiniz.

 class Migration(SchemaMigration): def forwards(self, orm): # Deleting model 'Foo' db.delete_table('myapp_foo') # Adding model 'Bar' db.create_table('myapp_bar', ( ... )) db.send_create_signal('myapp', ['Bar']) def backwards(self, orm): ... 

Bu, istədiyiniz hər hansı bir şey deyil. Bunun əvəzinə, belə bir şəkildə görünməsi üçün köçürməni düzəldin:

border=0
 class Migration(SchemaMigration): def forwards(self, orm): # Renaming model from 'Foo' to 'Bar' db.rename_table('myapp_foo', 'myapp_bar') if not db.dry_run: orm['contenttypes.contenttype'].objects.filter( app_label='myapp', model='foo').update(model='bar') def backwards(self, orm): # Renaming model from 'Bar' to 'Foo' db.rename_table('myapp_bar', 'myapp_foo') if not db.dry_run: orm['contenttypes.contenttype'].objects.filter(app_label='myapp', model='bar').update(model='foo') 

db.send_create_signal adlı bir update bəyanatının olmadığı halda, yeni model adı ilə yeni bir ContentType yaradır. Bəzi məlumat bazası obyektlərinə (məsələn, GenericForeignKey vasitəsilə) işarə edirsinizsə, ən yaxşı halda, bir update ContentType var.

Həm də, adlandırılmış model üçün xarici düymələr olan bəzi sütunların adını dəyişdiyiniz halda, unutmayın

 db.rename_column(myapp_model, foo_id, bar_id) 
66
11 сент. Cavab Cian 11 sentyabr verilir. 2012-09-11 03:21 '12 saat 03:21 'da 2012-09-11 03:21

Cənub bunu özü edə bilməz - Bar təmsil Foo necə bilir, Foo nə üçün istifadə olunur? Xüsusi göç üçün yazdım. Yuxarıda göstərdiyiniz kimi ForeignKey dəyişə bilərsiniz və sonra yalnız hər hansı bir şəkildə edə biləcəyiniz müvafiq sahələri və masaları dəyişə bilərsiniz.

Nəhayət, həqiqətən bunu etmək lazımdır? Mən hələ modelin adını dəyişmək lazım deyil. Model adları verbose_name Meta variantının mövcudluğu nəzərə alınmaqla, sadəcə bir tətbiq həyata verbose_name .

5
19 мая '10 в 8:25 2010-05-19 08:25 Dominik Rodger 19 may '10 saat 08: 25-də cavab verib 2010-05-19 08:25

Mən yuxarıdakı Leopd həllini izlədim. Amma modellərin adlarını dəyişdirməmişdi. Mən kodunu öz əlimdə dəyişdim (FK deyildiyi yerlərdə də bağlı modellərdə). Və başqa cənub miqrasiyasını etdi, amma seçimi ilə. Bu model adları və masa adlarını eyni edir.

Yalnız başa düşdükdən sonra, ilk növbədə model adlarını dəyişdirərək başlaya bilərsiniz və sonra onları tətbiq etmədən əvvəl miqrasiya faylını düzəldə bilərsiniz. Çox təmiz.

-1
19 дек. Cavab 19 dekabrda gowthaman tərəfindən verilir . 2014-12-19 00:14 '14 'də 0:14 2014-12-19 00:14

Tags ilə bağlı digər suallar və ya bir sual