#23418 closed Cleanup/optimization (fixed)
Classes embedded inside other classes are not serialized correctly
Reported by: | Dan Loewenherz | Owned by: | Markus Holtermann |
---|---|---|---|
Component: | Migrations | Version: | 1.7 |
Severity: | Normal | Keywords: | |
Cc: | info+coding@… | Triage Stage: | Unreviewed |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
Simple example:
class Store(models.Model): @deconstructible class IgnoreFormatString(object): def __init__(self, s): self.s = s def __str__(self): return self.s def __mod__(self, k): return self name = models.CharField(max_length=64, null=True) rating = models.IntegerField(error_messages={'invalid': IgnoreFormatString("You've entered an invalid value.")}, null=True)
The migration is created appropriately, but running it will fail with something like the following:
Traceback (most recent call last): File "./manage.py", line 10, in <module> execute_from_command_line(sys.argv) File "my_project/lib/python2.7/site-packages/django/core/management/__init__.py", line 385, in execute_from_command_line utility.execute() File "my_project/lib/python2.7/site-packages/django/core/management/__init__.py", line 377, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "my_project/lib/python2.7/site-packages/django/core/management/base.py", line 288, in run_from_argv self.execute(*args, **options.__dict__) File "my_project/lib/python2.7/site-packages/django/core/management/base.py", line 338, in execute output = self.handle(*args, **options) File "my_project/lib/python2.7/site-packages/django/core/management/commands/migrate.py", line 63, in handle executor = MigrationExecutor(connection, self.migration_progress_callback) File "my_project/lib/python2.7/site-packages/django/db/migrations/executor.py", line 17, in __init__ self.loader = MigrationLoader(self.connection) File "my_project/lib/python2.7/site-packages/django/db/migrations/loader.py", line 48, in __init__ self.build_graph() File "my_project/lib/python2.7/site-packages/django/db/migrations/loader.py", line 173, in build_graph self.load_disk() File "my_project/lib/python2.7/site-packages/django/db/migrations/loader.py", line 103, in load_disk migration_module = import_module("%s.%s" % (module_name, migration_name)) File "/usr/local/Cellar/python/2.7.6/Frameworks/Python.framework/Versions/2.7/lib/python2.7/importlib/__init__.py", line 37, in import_module __import__(name) File "my_project/app/migrations/0001_initial.py", line 8, in <module> class Migration(migrations.Migration): File "my_project/app/migrations/0001_initial.py", line 19, in Migration ('rating', models.IntegerField(null=True, error_messages={b'invalid': app.models.IgnoreFormatString(b"You've entered an invalid value.")})), AttributeError: 'module' object has no attribute 'IgnoreFormatString
Let me know if you need anything else to help diagnose the issue or have any questions. Cheers!
Change History (13)
comment:1 by , 10 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:4 by , 10 years ago
@Andrew Any way we can prevent the migration itself from being created as well? Although the docs mention it now, the migration is still created and users won't encounter the error until after running it. Thoughts?
comment:5 by , 10 years ago
Resolution: | invalid |
---|---|
Status: | closed → new |
Reopening since I'm not convinced a doc-only change is sufficient. I'm happy to contribute a patch if needed.
comment:6 by , 10 years ago
Cc: | added |
---|---|
Has patch: | set |
Owner: | changed from | to
Status: | new → assigned |
Type: | Bug → Cleanup/optimization |
I opened a pull-request: https://github.com/django/django/pull/3194
comment:8 by , 10 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
Unfortunately, this is unserializable, as there's no way to get the reference to the surrounding class from the inner class. I'll update the docs to mention this, but the only fix for you is to move InvalidFormatString to the outer scope.