Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django migration error :you cannot alter to or from M2M fields, or add or remove through= on M2M fields

I'm trying to modify a M2M field to a ForeignKey field. The command validate shows me no issues and when I run syncdb :

ValueError: Cannot alter field xxx into yyy they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields) 

So I can't make the migration.

class InstituteStaff(Person):     user                 = models.OneToOneField(User, blank=True, null=True)     investigation_area   = models.ManyToManyField(InvestigationArea, blank=True,)     investigation_group  = models.ManyToManyField(InvestigationGroup, blank=True)     council_group        = models.ForeignKey(CouncilGroup, null=True, blank=True)     #profiles            = models.ManyToManyField(Profiles, null = True, blank = True)     profiles             = models.ForeignKey(Profiles, null = True, blank = True) 

This is my first Django project so any suggestions are welcome.

like image 966
loar Avatar asked Nov 14 '14 10:11

loar


People also ask

What is difference between migrate and Makemigrations in Django?

makemigrations is responsible for packaging up your model changes into individual migration files - analogous to commits - and migrate is responsible for applying those to your database.

What does migrate command do in Django?

migrate executes those SQL commands in the database file. So after executing migrate all the tables of your installed apps are created in your database file. You can confirm this by installing SQLite browser and opening db.


1 Answers

I stumbled upon this and although I didn't care about my data much, I still didn't want to delete the whole DB. So I opened the migration file and changed the AlterField() command to a RemoveField() and an AddField() command that worked well. I lost my data on the specific field, but nothing else.

I.e.

migrations.AlterField(     model_name='player',     name='teams',     field=models.ManyToManyField(related_name='players', through='players.TeamPlayer', to='players.Team'), ), 

to

migrations.RemoveField(     model_name='player',     name='teams', ), migrations.AddField(     model_name='player',     name='teams',     field=models.ManyToManyField(related_name='players', through='players.TeamPlayer', to='players.Team'), ), 
like image 77
wanaryytel Avatar answered Sep 18 '22 20:09

wanaryytel