Django

2015-12-10 13 views
11

'daki bir tablonun yeniden adlandırılması için otomatik olarak oluşturulmuş bir geçişi geri alırken hata oluştu geri döndürme, bir tablonun yeniden adlandırılmasını içeren bir Django (1.8.7) geçişi ile ilgili sorun yaşıyorum. Postgres'de yeniden adlandırmak mümkün görünmesine rağmen, eski tablo adını kullanarak bir kısıtlama eklemeyi dener. İşte Django

traceback var:

cursor.execute(sql, params) 
    File "/Users/myworkspace/projects/xxx/venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/Users/myworkspace/projects/xxx/venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "/Users/myworkspace/projects/xxx/venv/lib/python3.5/site-packages/django/db/utils.py", line 97, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/Users/myworkspace/projects/xxx/venv/lib/python3.5/site-packages/django/utils/six.py", line 658, in reraise 
    raise value.with_traceback(tb) 
    File "/Users/myworkspace/projects/xxx/venv/lib/python3.5/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
django.db.utils.ProgrammingError: relation "team_membershiprole" does not exist 

onun ürettiği SQL bir göz atacak olursak,

[...] 
ALTER TABLE "team_membershiprole" RENAME TO "team_leadershiprole"; 
[...] 
ALTER TABLE "team_leadershipteammember" 
    ADD CONSTRAINT "team_l_role_id_xxx" 
    FOREIGN KEY ("role_id") REFERENCES "team_membershiprole" ("id")  
    DEFERRABLE INITIALLY DEFERRED; 
[...] 

COMMIT; 

O tablo yapmasa da, team_membershiprole bir gönderme var olduğunu görebilirsiniz artık var (yeniden adlandırıldı).

# -*- coding: utf-8 -*- 
from __future__ import unicode_literals 

from django.db import models, migrations 


class Migration(migrations.Migration): 

    dependencies = [ 
     ('core', '0023_xxx'), 
     ('team', '0009_xxx2'), 
    ] 

    operations = [ 
     migrations.CreateModel(
      name='TeamMembership', 
      fields=[ 
       ('id', models.AutoField(serialize=False, auto_created=True, verbose_name='ID', primary_key=True)), 
       ('team', models.ForeignKey(related_name='members', to='team.Team')), 
       ('member', models.ForeignKey(to='core.Member')), 
      ], 
     ), 
     migrations.RenameModel(
      old_name='LeadershipRole', 
      new_name='MembershipRole', 
     ), 
     migrations.RemoveField(
      model_name='leadershipteammember', 
      name='team', 
     ), 
     migrations.RemoveField(
      model_name='leadershipteammember', 
      name='member', 
     ), 
     migrations.RemoveField(
      model_name='leadershipteammember', 
      name='role', 
     ), 
     migrations.DeleteModel(
      name='LeadershipTeamMember', 
     ), 
     migrations.AddField(
      model_name='teammembership', 
      name='role', 
      field=models.ForeignKey(to='team.MembershipRole'), 
     ), 
    ] 

bunu anlıyorum Django göçler hata olabilir, ama bunun geçici bir çözüm için herhangi bir yol yoktur: Burada göç kodu?

+1

1.9'da çalışıp çalışmadığını kontrol edip edemiyorsanız, https://code.djangoproject.com/newticket adresinden bir bilet oluşturun? Bu ayrıca kök nedenini belirlemeye ve bir geçici çözüm geliştirmeye yardımcı olmalıdır. – knbk

+0

Bunu deneyeceğim ve sonuçları ile tekrar yorumlayacağım. –

cevap

1

Migration.unapply özelliğini geçersiz kılabilirsiniz, böylece farklı bir işlem kümesi kullanır.

class MyMigration(Migration): 
    operations = [ 
     ... your operations ... 
    ] 
    reverse_operations = [ 
     ... your fixed reverse operations ... 
    ] 
    def unapply(self, project_state, schema_editor, collect_sql=False): 
     self.operations = self.reverse_operations 
     return super(MyMigration, self).unapply(..) 

Bunu test etmedim ama size bir fikir vermesi gerekiyor. Oh ve geri göçmenlerin listesini tersine çevirmeniz gerekebilir, çünkü Django ileriye doğru geçişlerin bir listesi olmasını bekliyor, bu yüzden onları tersine çevir.

+0

Bu mantıklı, ancak ters geçiş için ham SQL sorguları eklemeliyim? En azından operasyonlar için Django taşıma API'sini kullanmaya devam etmek istiyorum. –

+0

Kaynağa bakma Gövde.unapply'ı geçersiz kılabileceğiniz ve super (..) çağrılmadan önce özelleştirilmiş bir self.operations'ı hackleyebildiğiniz gibi görünüyor. Bence bu en iyisi, ilk önce önerdiğim RunPython'a ihtiyacın yok. –