#24266: Deprecate `Options.get_parent_list` in favor of a new `get_ancestors` one. -------------------------------------+------------------------------------- Reporter: charettes | Owner: nobody Type: | Status: new Uncategorized | Component: Database | Version: master layer (models, ORM) | Severity: Normal | Keywords: Triage Stage: | Has patch: 0 Unreviewed | Needs documentation: 0 | Needs tests: 0 Patch needs improvement: 0 | Easy pickings: 0 UI/UX: 0 | -------------------------------------+------------------------------------- The `get_parent_list()` method was introduced [https://github.com/django/django/blame/a53541852d5601232899e54d66e623bc163c6dc2/django/db/models/options.py#L647-L656 more than 6 years ago] and has been returning an unordered `set()` since then.
From the method name suffix and the misleading `__doc__` I guess the returned data type was changed late in the process of merging [https://github.com/django/django/commit/9c52d56f6f8a9cdafb231adf9f4110473099c9b5 Malcom's queryset refactor] in order to deal with the multiple ORM's ancestors existence checks by reducing [https://wiki.python.org/moin/TimeComplexity time complexity]. While working on fixing a field shadowing issue in multi-inheritance scenarios (#24249) it was discovered that [https://github.com/django/django/pull/4018#issuecomment-72201349 `get_parent_list()` actually returns] an unordered `set()` which might causes non-deterministic behaviors. For example, another patch working on making sure unique checks take multi-inheritance into account (#15321) could result in different validation errors being raised from the same input based on the non-deterministic ordering of ancestors. Since the undocumented `get_parent_list()` method seems to be [https://github.com/search?utf8=%E2%9C%93&q=get_parent_list+language%3Apython&type=Code&ref=searchresults used in the wild] I suggest we deprecate and replace it by a `get_ancestors()` one with the following properties: * A more significant name given it returns ancestors regardless of lineage. * A return value ordered by the `__mro__` of the model. * A return value with `in` operations with similar time complexity. One of the available data structure with the required return value properties is `django.utils.datastructures.OrderedSet` but I wonder if the whole time complexity argument is not moot given multi-inheritance scenarios involving many ancestors shouldn't be that common. In this case, given we don't mind about backward compatibility of such a private API, we could also fix `get_parent_list()` to actually return a list of unique ancestors ordered by `__mro__`. -- Ticket URL: <https://code.djangoproject.com/ticket/24266> 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/052.465aee56357fcc42af536959a83a842a%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.