Opened 10 years ago

Closed 10 years ago

Last modified 10 years ago

#21893 closed Bug (fixed)

Migrations RunPython operations seem to trip on MTI models.

Reported by: loic84 Owned by: Loic Bistuer <loic.bistuer@…>
Component: Migrations Version: 1.7-alpha-1
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: yes Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

The attached tests demonstrate 2 issues:

  • The pk isn't assigned after a call to objects.create(), although I can confirm that the object is properly created.
pony = ShetlandPony.objects.create()
self.assertIsNot(pony.pk, None)
  • objects.create() doesn't accept any arguments that refer to superclasses' fields:
>>> pony = ShetlandPony.objects.create(weight=5)
Traceback (most recent call last):
  File "/Users/loic/Dev/django/tests/migrations/test_operations.py", line 544, in test_run_python
    operation.database_forwards("test_runpython", editor, project_state, new_state)
  File "/Users/loic/Dev/django/django/db/migrations/operations/special.py", line 141, in database_forwards
    self.code(models=from_state.render(), schema_editor=schema_editor)
  File "/Users/loic/Dev/django/tests/migrations/test_operations.py", line 538, in create_shetlandponies
    pony2 = ShetlandPony.objects.create(weight=5)
  File "/Users/loic/Dev/django/django/db/models/manager.py", line 92, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "/Users/loic/Dev/django/django/db/models/query.py", line 364, in create
    obj = self.model(**kwargs)
  File "/Users/loic/Dev/django/django/db/models/base.py", line 465, in __init__
    raise TypeError("'%s' is an invalid keyword argument for this function" % list(kwargs)[0])
TypeError: 'weight' is an invalid keyword argument for this function

Attachments (1)

test.diff (4.1 KB ) - added by loic84 10 years ago.

Download all attachments as: .zip

Change History (6)

by loic84, 10 years ago

Attachment: test.diff added

comment:1 by Tim Graham, 10 years ago

Triage Stage: UnreviewedAccepted

comment:2 by loic84, 10 years ago

I've looked into this further, the problem wasn't how the system dealt with the migration that I've reproduced in the test case, but how I ended with this migration to begin with.

I have abstract models that inherit from concrete models to add python level functionality.

The problem is that these are ruled out by: https://github.com/django/django/blob/master/django/db/migrations/state.py#L162.

Fixing this condition doesn’t help because Apps.get_model() do not support abstract models and that's what ModelState.render() uses: https://github.com/django/django/blob/master/django/db/migrations/state.py#L203

I’m not sure what’s the best course of action, something specific to migrations, or a fix at the app registry level, maybe include_abstract akin to the existing include_auto_created, include_deferred, include_swapped.

comment:4 by Loic Bistuer <loic.bistuer@…>, 10 years ago

Owner: set to Loic Bistuer <loic.bistuer@…>
Resolution: fixed
Status: newclosed

In 6436f1fad9ce51f18735106ac75aeea3d6d1f310:

Fixed #21893 -- ModelState didn't account for MTI parents inherited from abstract models.

comment:5 by Andrew Godwin <andrew@…>, 10 years ago

In 8fcc0140d075688e7b0565dea225f4380fc638c4:

Merge pull request #2396 from loic/ticket21893

Fixed #21893 -- ModelState didn't account for MTI parents inherited from abstract models.

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