#24201: order_with_respect_to GenericForeignKey -------------------------------------+------------------------------------- Reporter: Alex Hill | Owner: nobody Type: New feature | Status: closed Component: Database layer | Version: (models, ORM) | Severity: Normal | Resolution: fixed Keywords: | Triage Stage: Ready for | checkin Has patch: 1 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 -------------------------------------+-------------------------------------
Comment (by Ashley Waite): Replying to [comment:16 Simon Charette <charette.s@…>]: > In [changeset:"c0118ff80bd14fe0f65843e5df266ec5d922304d" c0118ff8]: > {{{ > #!CommitTicketReference repository="" revision="c0118ff80bd14fe0f65843e5df266ec5d922304d" > Refs #24201 -- Ignored order_with_respect_to private fields in migrations. > > Thanks Tim for the review. > }}} This commit removes the {{{order_with_respect_to}}} option during migration state if it's a generic foreign key. I can see why this was done, as private fields are not present on the model state, so it cannot be resolved. However, as the option is removed, no {{{_order}}} field is created in the database and no {{{AlterOrderWithRespectTo}}} operations can be generated for the migration either. An {{{AlterOrderWithRespectTo}}} operation cannot be manually added either because the migrations {{{ModelState}}} does not copy private fields either, so attempting to add it results in referring to a field it cannot find. Manually adding an {{{AlterOrderWithRespectTo}}} operation referring to another field will result in it being removed in any subsequent migration. When you attempt to use the model it hard breaks because there's no {{{_order}}} field in the database. {{{ psycopg2.ProgrammingError: column test_model._order does not exist django.db.utils.ProgrammingError: column test_model._order does not exist }}} This requires several changes in the migration module to resolve _correctly_, but can be hackishly bypassed by replacing [[https://github.com/django/django/blob/c0118ff80bd14fe0f65843e5df266ec5d922304d/django/db/migrations/state.py#L446-L448|state.py#446-448]] with: {{{ # Private fields are ignored, so remove options that refer to them. elif options.get('order_with_respect_to') in (field.name for field in model._meta.private_fields): options['order_with_respect_to'] = model._meta.pk.attname }}} Which leads to the creation of {{{_order}}} and {{{AlterOrderWithRespectTo}}} operations, thinking that it's ordering according to the {{{id}}} field, but as it migrates and functions successfully, this is the clear source of why it currently breaks. -- Ticket URL: <https://code.djangoproject.com/ticket/24201#comment:17> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/066.191ac103bb70847a0c370861fa3113cb%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.