Opened 11 years ago
Closed 11 years ago
#21438 closed Bug (fixed)
Migrations do not detect many to many fields
Reported by: | Owned by: | Andrew Godwin | |
---|---|---|---|
Component: | Migrations | Version: | dev |
Severity: | Normal | Keywords: | manytomany foreignkey |
Cc: | Triage Stage: | Accepted | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
When I add a manytomany field to an existing model, and then do a migration, the corresponding table does not get created. Sample error:
--------------------------------------------------------------------------- OperationalError Traceback (most recent call last) <ipython-input-6-6970514bfc33> in <module>() ----> 1 c.save() /usr/local/lib/python2.7/dist-packages/django/db/models/base.pyc in save(self, force_insert, force_update, using, update_fields) 579 580 self.save_base(using=using, force_insert=force_insert, --> 581 force_update=force_update, update_fields=update_fields) 582 save.alters_data = True 583 /usr/local/lib/python2.7/dist-packages/django/db/models/base.pyc in save_base(self, raw, force_insert, force_update, using, update_fields) 616 if not meta.auto_created: 617 signals.post_save.send(sender=origin, instance=self, created=(not updated), --> 618 update_fields=update_fields, raw=raw, using=using) 619 620 save_base.alters_data = True /usr/local/lib/python2.7/dist-packages/django/dispatch/dispatcher.pyc in send(self, sender, **named) 183 184 for receiver in self._live_receivers(sender): --> 185 response = receiver(signal=self, sender=sender, **named) 186 responses.append((receiver, response)) 187 return responses /home/zah/project/instruments/utils.pyc in wrapper(sender, **kwargs) 20 @wraps(func) 21 def wrapper(sender, **kwargs): ---> 22 return func(kwargs.get('instance')) 23 signal.connect(wrapper, sender=cls) 24 return wrapper /home/zah/project/instruments/models.py in post_save(self) 33 self.parameters.add(param) 34 def post_save(self): ---> 35 self.get_params() 36 def __unicode__(self): 37 return self.name /home/zah/project/instruments/models.py in get_params(self) 31 param = Parameter(name = param_name) 32 param.save() ---> 33 self.parameters.add(param) 34 def post_save(self): 35 self.get_params() /usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.pyc in add(self, *objs) 607 if rel.through._meta.auto_created: 608 def add(self, *objs): --> 609 self._add_items(self.source_field_name, self.target_field_name, *objs) 610 611 # If this is a symmetrical m2m relation to self, add the mirror entry in the m2m table /usr/local/lib/python2.7/dist-packages/django/db/models/fields/related.pyc in _add_items(self, source_field_name, target_field_name, *objs) 683 '%s__in' % target_field_name: new_ids, 684 }) --> 685 new_ids = new_ids - set(vals) 686 687 if self.reverse or source_field_name == self.source_field_name: /usr/local/lib/python2.7/dist-packages/django/db/models/query.pyc in __iter__(self) 138 - Responsible for turning the rows into model objects. 139 """ --> 140 self._fetch_all() 141 return iter(self._result_cache) 142 /usr/local/lib/python2.7/dist-packages/django/db/models/query.pyc in _fetch_all(self) 960 def _fetch_all(self): 961 if self._result_cache is None: --> 962 self._result_cache = list(self.iterator()) 963 if self._prefetch_related_lookups and not self._prefetch_done: 964 self._prefetch_related_objects() /usr/local/lib/python2.7/dist-packages/django/db/models/query.pyc in iterator(self) 1182 def iterator(self): 1183 if self.flat and len(self._fields) == 1: -> 1184 for row in self.query.get_compiler(self.db).results_iter(): 1185 yield row[0] 1186 elif not self.query.extra_select and not self.query.aggregate_select: /usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.pyc in results_iter(self) 672 fields = None 673 has_aggregate_select = bool(self.query.aggregate_select) --> 674 for rows in self.execute_sql(MULTI): 675 for row in rows: 676 if has_aggregate_select: /usr/local/lib/python2.7/dist-packages/django/db/models/sql/compiler.pyc in execute_sql(self, result_type) 753 754 cursor = self.connection.cursor() --> 755 cursor.execute(sql, params) 756 757 if not result_type: /usr/local/lib/python2.7/dist-packages/django/db/backends/utils.pyc in execute(self, sql, params) 75 start = time() 76 try: ---> 77 return super(CursorDebugWrapper, self).execute(sql, params) 78 finally: 79 stop = time() /usr/local/lib/python2.7/dist-packages/django/db/backends/utils.pyc in execute(self, sql, params) 59 return self.cursor.execute(sql) 60 else: ---> 61 return self.cursor.execute(sql, params) 62 63 def executemany(self, sql, param_list): /usr/local/lib/python2.7/dist-packages/django/db/utils.pyc in __exit__(self, exc_type, exc_value, traceback) 91 if dj_exc_type not in (DataError, IntegrityError): 92 self.wrapper.errors_occurred = True ---> 93 six.reraise(dj_exc_type, dj_exc_value, traceback) 94 95 def __call__(self, func): /usr/local/lib/python2.7/dist-packages/django/db/backends/utils.pyc in execute(self, sql, params) 59 return self.cursor.execute(sql) 60 else: ---> 61 return self.cursor.execute(sql, params) 62 63 def executemany(self, sql, param_list): /usr/local/lib/python2.7/dist-packages/django/db/backends/sqlite3/base.pyc in execute(self, query, params) 487 return Database.Cursor.execute(self, query) 488 query = self.convert_query(query) --> 489 return Database.Cursor.execute(self, query, params) 490 491 def executemany(self, query, param_list):
Change History (3)
comment:1 by , 11 years ago
Summary: | Djando migrations do not track many to many fields → Migrations do not detect many to many fields |
---|---|
Triage Stage: | Unreviewed → Accepted |
comment:2 by , 11 years ago
Owner: | set to |
---|---|
Status: | new → assigned |
Probably an oversight on my part. I'll look into it.
comment:3 by , 11 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Note:
See TracTickets
for help on using tickets.
I confirmed that after adding a
ManyToManyField
to an existing model and runningmakemigrations
, no changes are detected.