2012-11-28 6 views
6

Próbuję przeprowadzić migrację kilku modeli z jednej aplikacji Django do innej i na podstawie tego pytania How do I migrate a model out of one django app and into a new one? Mam dość dużo pracy, ale podczas tworzenia pierwszej migracji otrzymuję ten błąd:contenttypes.contenttype nie jest dostępny w tej migracji

"The model 'contenttype' from the app 'contenttypes' is not available in this migration." 

Google i SO nie wydają się znaleźć żadnych przypadków dla tego zdarzenia i wspomniana kwestia nie ma nic konkretnego do powiedzenia na ten temat albo, z wyjątkiem komentarza w kodzie:

if not db.dry_run: 
    # For permissions to work properly after migrating 
    orm['contenttypes.contenttype'].objects.filter(app_label='common', model='cat').update(app_label='specific') 

Naprawdę doceniam zjadłem wszelki wgląd w to, co robię źle.

Oto dwa pliki migracji:

Utwórz:

# encoding: utf-8 
import datetime 
from south.db import db 
from south.v2 import SchemaMigration 
from django.db import models 

class Migration(SchemaMigration): 

    def forwards(self, orm): 
     db.rename_table('cars_country', 'general_country') 
     if not db.dry_run: 
      # For permissions to work properly after migrating 
      orm['contenttypes.ContentType'].objects.filter(app_label='cars', model='country').update(app_label='general') 

    def backwards(self, orm): 
     pass 

Usuń:

# encoding: utf-8 
import datetime 
from south.db import db 
from south.v2 import SchemaMigration 
from django.db import models 

class Migration(SchemaMigration): 

    depends_on = (
     ('general', '0002_create_country'), 
    ) 

    def forwards(self, orm): 

     db.alter_column('cars_club', 'country_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['general.Country'], null=True)) 


    def backwards(self, orm): 

     db.rename_table('general_country', 'cars_country') 
     db.alter_column('cars_club', 'country_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['cars.Country'], null=True)) 
+0

Według South Docs: _Uwaga, że ​​można uzyskać dostęp tylko do modeli, które zostały zamrożone; Południe automatycznie zawiera wszystko, co może być osiągnięte za pomocą kluczy obcych lub relacji wiele do wielu, ale jeśli chcesz dodać inne modele, po prostu przekaż --freeze appname do polecenia ./manage.py datamigration._ – dgel

+0

Więc brzmi tak jak w pewnym momencie musisz przekazać aplikację ContentTypes do -freeze. Nie rozumiem w pełni, ale może to być wskazówka we właściwym kierunku. – dgel

+0

Zakładając, że aplikacja ContentTypes nie jest celem żadnej schemamigracji, jak źle jest zaimportować modele z projektu Django? _z django.contrib.contenttypes.models import ContentType_ _ContentType.objects.filter (app_label = 'common', model = 'cat'). update (app_label = 'specific') _ – JCJS

Odpowiedz

4

Ok, znalazłem rozwiązanie. Zawiadomienie o zamrożeniu od dgel sprawiło, że sprawdziłem dokumentację południową i jest informacja o migracji ORM: Dokonuje się tego poprzez szeregowanie modeli w duży słownik zwany modelami u dołu każdej migracji. Łatwo to zobaczyć; to duży fragment gęstego kodu na dole.

Tak więc po prostu potrzebowałem przenieść orm ['contenttypes.contenttype] do drugiego pliku migracji, ponieważ słownik modeli treści już tam był. A teraz wszystko wydaje się działać tak, jak powinno.

+2

Albo po prostu utwórz swoją transmisję danych jako: ' ./manage.py datamigration nazwa_aplikacji --auto --freeze contenttypes' – geoom