2016-06-14 7 views
0

ここで私は今朝私のシステムで2回複製しました。 djangoを使って作業する1.9.2。Django 1の間違った移行がデータモデルを乱す

は非常に単純に、私はモデルに変更を加えた、私はこの変更:これに

class Sighting(models.Model): 
     caption = models.CharField(max_length=100,default=None) 
     subspecies = models.ForeignKey(Subspecies, default=None, blank=True) 
     lat = models.FloatField(default=None) 
     lng = models.FloatField(default= None) 
     #location = models.CharField(max_length=100, default=None, null=True, blank=True) 
     sighting_date = models.DateTimeField() 
     image = models.ImageField(default=None) 
     user_id = models.IntegerField(default=None) 

     def __str__(self): 
       return self.caption 

class Sighting(models.Model): 
     caption = models.CharField(max_length=100,default=None) 
     subspecies = models.ForeignKey(Subspecies, default=None, blank=True) 
     species_tags = models.CharField(max_length=100,default=None) 
     lat = models.FloatField(default=None) 
     lng = models.FloatField(default= None) 
     #location = models.CharField(max_length=100, default=None, null=True, blank=True) 
     sighting_date = models.DateTimeField() 
     image = models.ImageField(default=None) 
     user_id = models.IntegerField(default=None) 

     def __str__(self): 
       return self.caption 

を私がモデルにspecies_tagsフィールドを追加しました。私は正常にmakemigrationsを実行した後、私はこのエラーを得たmigrateしようとした:

django.db.utils.IntegrityError: NOT NULL constraint failed: birds_sighting.species_tags

だから、私は新しい分野へblank=True, null=Trueを追加し、これにモデルを変更:

class Sighting(models.Model): 
     caption = models.CharField(max_length=100,default=None) 
     subspecies = models.ForeignKey(Subspecies, default=None, blank=True) 
     species_tags = models.CharField(max_length=100,default=None, blank=True, null=True) 
     lat = models.FloatField(default=None) 
     lng = models.FloatField(default= None) 
     #location = models.CharField(max_length=100, default=None, null=True, blank=True) 
     sighting_date = models.DateTimeField() 
     image = models.ImageField(default=None) 
     user_id = models.IntegerField(default=None) 

     def __str__(self): 
       return self.caption 

私は再びmakemigrationsを走りました、それは再びmigrateの変化を反映し、同じエラーを示しました。

次に、マイグレーションフォルダに入って、今日作成した以前のマイグレーションを手動で削除してから、makemigrationsmigrateを実行して正常に動作しました。私は再び2回テストしましたが、最初にblank=True, null=Trueプロパティを設定せずにモデルにフィールドを追加してmakemigrationsを実行しただけで、モデルを修正するだけでマイグレーションができなくなりました。以前に行ったマイグレーションを手動で削除する必要がありましたエラー。

You are encouraged to make migrations freely and not worry about how many you have; the migration code is optimized to deal with hundreds at a time without much slowdown.

私は私が私のワークフローで間違ってここで何かをやっている把握、およびヘルプは大歓迎されています。私は、hereを参照してください、あなたがこれをしなければならなかったとは思いませんでした。

答えて

2

djangoでは、以前に実行されなかった移行は、移行ファイル名に表示されているように、移行番号順に実行されます。 null=Trueなしで新しいフィールドを追加しようとすると、データベースは、既存の行の列の値を期待しているため、エラーをスローします。

この移行を実行できないことがわかっているので、blank=True, null=Trueで別の移行を作成します。しかし、djangoは順番に移行を実行し、2番目の移行を実行する前に再度最初の移行を実行しようとします。だから、あなたは常に、あなたが以前に

subspecies = models.ForeignKey(Subspecies, blank=False) 

または

subspecies = models.ForeignKey(Subspecies, unique = True) 

ようなモデルのものを作成し、それを削除していたように思え

+0

私は手動でマイグレーションを削除することはややこしいと思っていましたが、この種のエラーは多く発生します。 fミス。 –

+1

@jeffery_the_windしかし、それはどのようにジャンゴの作品です –

0

を移行する実行する前に、間違った移行を削除する必要がありますどの

関連する問題