#36878: Migration's ModelState has varying type for unique_together and
index_together options causing autodetector crash
-------------------------------------+-------------------------------------
     Reporter:  Markus Holtermann    |                    Owner:  Markus
                                     |  Holtermann
         Type:  Bug                  |                   Status:  closed
    Component:  Migrations           |                  Version:  dev
     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
-------------------------------------+-------------------------------------
Changes (by Jacob Walls <jacobtylerwalls@…>):

 * resolution:   => fixed
 * status:  assigned => closed

Comment:

 In [changeset:"83622b824b7014977dfc7086bbc2628ea53f4cd0" 83622b82]:
 {{{#!CommitTicketReference repository=""
 revision="83622b824b7014977dfc7086bbc2628ea53f4cd0"
 Fixed #36878 -- Unified data type for *_together options in ModelState.

 Ever since the beginning of Django's migration framework, there's been a
 bit of an inconsistency on how index_together and unique_together values
 have been stored on the ModelState[^1].

 It's only really obvious, when looking at the current code for
 `from_model()`[^2] and the `rename_field()` state alteration code[^3].

 The problem in the autodetector's detection of the `*_together` options
 as raised in the ticket, reinforces the inconsistency[^4]: the old value
 is being normalized to a set of tuples, whereas the new value is taken
 as-is.

 Why this hasn't been caught before, is likely to the fact, that we
 never really look at a `to_state` that comes from migration operations
 in the autodetector. Instead, in both usages in Django[^5], [^6] the
 `to_state` is a `ProjectState.from_apps()`. And that state is
 consistently using sets of tuples and not lists of lists.

 [^1]:
 
https://github.com/django/django/commit/67dcea711e92025d0e8676b869b7ef15dbc6db73
 #diff-
 5dd147e9e978e645313dd99eab3a7bab1f1cb0a53e256843adb68aeed71e61dcR85-R87
 [^2]:
 
https://github.com/django/django/blob/b1ffa9a9d78b0c2c5ad6ed5a1d84e380d5cfd010/django/db/migrations/state.py#L842
 [^3]:
 
https://github.com/django/django/blob/b1ffa9a9d78b0c2c5ad6ed5a1d84e380d5cfd010/django/db/migrations/state.py#L340-L345
 [^4]:
 
https://github.com/django/django/blob/b1ffa9a9d78b0c2c5ad6ed5a1d84e380d5cfd010/django/db/migrations/autodetector.py#L1757-L1771
 [^5]:
 
https://github.com/django/django/blob/2351c1b12cc9cf82d642f769c774bc3ea0cc4006/django/core/management/commands/makemigrations.py#L215-L219
 [^6]:
 
https://github.com/django/django/blob/2351c1b12cc9cf82d642f769c774bc3ea0cc4006/django/core/management/commands/migrate.py#L329-L332
 }}}
-- 
Ticket URL: <https://code.djangoproject.com/ticket/36878#comment:8>
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 [email protected].
To view this discussion visit 
https://groups.google.com/d/msgid/django-updates/0107019c0673f9b4-d92924ef-f119-4515-b451-fc2d1dffaa75-000000%40eu-central-1.amazonses.com.

Reply via email to