Opened 6 years ago

Closed 6 years ago

Last modified 8 months ago

#23950 closed Bug (fixed)

Adding 'deconstruct' method breaks serialization of type

Reported by: Gavin Wahl Owned by: nobody
Component: Migrations Version: 1.7
Severity: Normal Keywords:
Cc: Triage Stage: Ready for checkin
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

This is similar to #22951, which I think just didn't fix the problem entirely. I'm getting the same error, but in a different location, when adding a deconstruct method:

Traceback (most recent call last):
  File "./manage.py", line 11, in <module>
    execute_from_command_line(sys.argv)
  File "django/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "django/core/management/commands/makemigrations.py", line 124, in handle
    self.write_migration_files(changes)
  File "django/core/management/commands/makemigrations.py", line 152, in write_migration_files
    migration_string = writer.as_string()
  File "django/db/migrations/writer.py", line 131, in as_string
    operation_string, operation_imports = OperationWriter(operation).serialize()
  File "django/db/migrations/writer.py", line 88, in serialize
    arg_string, arg_imports = MigrationWriter.serialize(arg_value)
  File "django/db/migrations/writer.py", line 331, in serialize
    return cls.serialize_deconstructed(path, args, kwargs)
  File "django/db/migrations/writer.py", line 239, in serialize_deconstructed
    arg_string, arg_imports = cls.serialize(arg)
  File "django/db/migrations/writer.py", line 334, in serialize
    return cls.serialize_deconstructed(*value.deconstruct())
TypeError: unbound method deconstruct() must be called with FooEnum instance as first argument (got nothing instead)

Change History (8)

comment:1 Changed 6 years ago by Tim Graham

Can you provide code to reproduce the error? A test for Django's test suite is ideal.

comment:2 Changed 6 years ago by Gavin Wahl

It happens when a class is passed to a custom field as an argument. This is used in the package django-enumfields, where the enum class is passed to EnumField. It was reported in that project as https://github.com/hzdg/django-enumfields/issues/22#issuecomment-65325260.

Here's the failing test for django: https://github.com/fusionbox/django/commit/a133c689903c8df92c6b25d3ae1b50a12bc66543

comment:3 Changed 6 years ago by Gavin Wahl

I was able to fix it, here's the PR: https://github.com/django/django/pull/3668

comment:4 Changed 6 years ago by Tim Graham

Has patch: set
Triage Stage: UnreviewedReady for checkin
Type: UncategorizedBug

comment:5 Changed 6 years ago by Tim Graham <timograham@…>

Resolution: fixed
Status: newclosed

In dee4d23f7e703aec2d1244e4facbf7f4c88deed5:

Fixed #23950 -- Prevented calling deconstruct on classes in MigrationWriter.

comment:6 Changed 6 years ago by Tim Graham <timograham@…>

In e9975ed3cd3243d78b89fe2b44a152263ba5a602:

[1.7.x] Fixed #23950 -- Prevented calling deconstruct on classes in MigrationWriter.

Backport of dee4d23f7e703aec2d1244e4facbf7f4c88deed5 from master

comment:7 Changed 8 months ago by Mariusz Felisiak <felisiak.mariusz@…>

In 8008795a:

Refs #23950 --- Moved test DeconstructibleInstances class to a module level.

DeconstructibleInstances was not importable from the asserted path.

comment:8 Changed 8 months ago by Mariusz Felisiak <felisiak.mariusz@…>

In ba57609:

[3.0.x] Refs #23950 --- Moved test DeconstructibleInstances class to a module level.

DeconstructibleInstances was not importable from the asserted path.

Backport of 8008795a3899d979d65832ca7c4946903de206f7 from master

Note: See TracTickets for help on using tickets.
Back to Top