-
-
Notifications
You must be signed in to change notification settings - Fork 454
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix ForeignKey queryset filters on un-swapped models #1495
Conversation
Marking as draft for tonight, will check the typing issue later this weekend |
mypy_django_plugin/django/context.py
Outdated
@@ -364,13 +366,19 @@ def _resolve_field_from_parts( | |||
|
|||
field = currently_observed_model._meta.get_field(field_part) | |||
if isinstance(field, RelatedField): | |||
currently_observed_model = field.related_model | |||
related_model = self.get_field_related_model_cls(field) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The code duplication is quite high. Can you please refactor it to be a method / function?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
wasn't a big fan of that too, I can do that yes 👍
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I was also considering actually raising LookupError
(or re-raising a custom UnregisteredModelError
or similar) in get_field_related_model_cls
and handle them in places we actually return mypy types. (return AnyType(TypeOfAny.from_error)
)
Currently this is quite cumbersome to pass None
values all the way up the intermediary functions/methods.
I'm not sure this is really better thought and maybe the intent is less clear?
1290dc5
to
dd5cf7b
Compare
Sorry, couldn't get back to this earlier, got caught up with other things. I tried the approach of raising an exception for unregistered model in The diff is a bit bigger because of that, let me know if this seems reasonable to you. EDIT: hum, test are passing locally, will investigate further. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks like a solid solution! Thank you!
FWIW, I only have little experience working on plugin code, but I had the same feeling: checking for and passing |
This PR contains the following updates: | Package | Type | Update | Change | Pending | |---|---|---|---|---| | [django-stubs](https://togithub.com/typeddjango/django-stubs) ([changelog](https://togithub.com/typeddjango/django-stubs/releases)) | dev | patch | `4.2.1` -> `4.2.2` | `4.2.3` | --- ### Release Notes <details> <summary>typeddjango/django-stubs (django-stubs)</summary> ### [`v4.2.2`](https://togithub.com/typeddjango/django-stubs/releases/tag/4.2.2) [Compare Source](https://togithub.com/typeddjango/django-stubs/compare/4.2.1...4.2.2) #### Headline changes - **mypy 1.4:** Recommended mypy version updated to 1.4.x - Support for `django-split-settings`, `django-configurations` and other Django settings addons with `strict_settings = false` option, [see README for details](https://togithub.com/typeddjango/django-stubs#how-to-use-a-custom-library-to-handle-django-settings) - We have now adopted [mypy's stubtest](https://mypy.readthedocs.io/en/stable/stubtest.html) to automatically find discrepancies between Django and django-stubs. If you want to contribute to django-stubs but are not sure where to start, have a look at [stubtest's TODO list](https://togithub.com/typeddjango/django-stubs/blob/master/scripts/stubtest/allowlist_todo.txt) file, which lists the many issues discovered by stubtest. ##### Django 4.2 changes - Applied Django 4.2 deprecations by [@​Alexerson](https://togithub.com/Alexerson) in [https://github.com/typeddjango/django-stubs/pull/1523](https://togithub.com/typeddjango/django-stubs/pull/1523) - Updated global settings and `AppConfig` class to match Django 4.2 by [@​Alexerson](https://togithub.com/Alexerson) in [https://github.com/typeddjango/django-stubs/pull/1524](https://togithub.com/typeddjango/django-stubs/pull/1524) - Added types for new 'system checks' in Django 4.2 by [@​Alexerson](https://togithub.com/Alexerson) in [https://github.com/typeddjango/django-stubs/pull/1526](https://togithub.com/typeddjango/django-stubs/pull/1526) - Added `ManifestStaticFilesStorage` new parameters by [@​Alexerson](https://togithub.com/Alexerson) in [https://github.com/typeddjango/django-stubs/pull/1528](https://togithub.com/typeddjango/django-stubs/pull/1528) - Added new methods to `Sitemap` class by [@​Alexerson](https://togithub.com/Alexerson) in [https://github.com/typeddjango/django-stubs/pull/1527](https://togithub.com/typeddjango/django-stubs/pull/1527) - Added new `headers=` parameter to `(Async)RequestFactory` and `(Async)Client` classes by [@​Alexerson](https://togithub.com/Alexerson) in [https://github.com/typeddjango/django-stubs/pull/1529](https://togithub.com/typeddjango/django-stubs/pull/1529) - Additional fixes by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1537](https://togithub.com/typeddjango/django-stubs/pull/1537) - GDAL-related GeoDjango updates in Django 4.2 by [@​Alexerson](https://togithub.com/Alexerson) in [https://github.com/typeddjango/django-stubs/pull/1525](https://togithub.com/typeddjango/django-stubs/pull/1525) - Added ORM `^` and `~` operator support, JSON lookup classes, Postgres lookup classes, `ModelForm` changes, `json_script` template filter parameters by [@​Alexerson](https://togithub.com/Alexerson) in [https://github.com/typeddjango/django-stubs/pull/1536](https://togithub.com/typeddjango/django-stubs/pull/1536) - Added and updated `db.backends` `DatabaseIntrospection` and `DatabaseOperations` classes by [@​GabDug](https://togithub.com/GabDug) in [https://github.com/typeddjango/django-stubs/pull/1571](https://togithub.com/typeddjango/django-stubs/pull/1571) ##### Stubs additions - Added `QuerySet._result_cache` attribute and `_fetch_all()` method by [@​adamchainz](https://togithub.com/adamchainz) in [https://github.com/typeddjango/django-stubs/pull/1505](https://togithub.com/typeddjango/django-stubs/pull/1505) - Added `ModelAdmin.search_help_text` attribute by [@​adamchainz](https://togithub.com/adamchainz) in [https://github.com/typeddjango/django-stubs/pull/1546](https://togithub.com/typeddjango/django-stubs/pull/1546) - Added email console handler `EmailBackend.write_message()` method by [@​adamchainz](https://togithub.com/adamchainz) in [https://github.com/typeddjango/django-stubs/pull/1547](https://togithub.com/typeddjango/django-stubs/pull/1547) - Added `ModelAdmin.get_formset_kwargs()` method by [@​adamchainz](https://togithub.com/adamchainz) in [https://github.com/typeddjango/django-stubs/pull/1545](https://togithub.com/typeddjango/django-stubs/pull/1545) - Added `Signal._live_receivers()` method by [@​adamchainz](https://togithub.com/adamchainz) in [https://github.com/typeddjango/django-stubs/pull/1551](https://togithub.com/typeddjango/django-stubs/pull/1551) - Added `SQLCompiler._order_by_pairs()` method by [@​adamchainz](https://togithub.com/adamchainz) in [https://github.com/typeddjango/django-stubs/pull/1586](https://togithub.com/typeddjango/django-stubs/pull/1586) - Added `memcache_key_warnings()` function by [@​rvanlaar](https://togithub.com/rvanlaar) in [https://github.com/typeddjango/django-stubs/pull/1562](https://togithub.com/typeddjango/django-stubs/pull/1562) ##### Stubs fixes - Fixed `create_model_instance` incorrect data argument type by [@​namper](https://togithub.com/namper) in [https://github.com/typeddjango/django-stubs/pull/1521](https://togithub.com/typeddjango/django-stubs/pull/1521) - Marked `RequestSite.{save,delete}` methods as `NoReturn` since they always raise by [@​sobolevn](https://togithub.com/sobolevn) in [https://github.com/typeddjango/django-stubs/pull/1530](https://togithub.com/typeddjango/django-stubs/pull/1530) - Updated `SafeExceptionReporterFilter` attributes and removed obsolete `CLEANSED_SUBSTITUTE` by [@​mthuurne](https://togithub.com/mthuurne) in [https://github.com/typeddjango/django-stubs/pull/1540](https://togithub.com/typeddjango/django-stubs/pull/1540) - Changed `AppConfig.default_auto_field` to attribute instead of method by [@​mthuurne](https://togithub.com/mthuurne) in [https://github.com/typeddjango/django-stubs/pull/1541](https://togithub.com/typeddjango/django-stubs/pull/1541) - Fixed `default_error_messages` attribute type of base `Field` and `GenericIPAddressField` classes by [@​asottile](https://togithub.com/asottile) in [https://github.com/typeddjango/django-stubs/pull/1538](https://togithub.com/typeddjango/django-stubs/pull/1538) - Improved spatialite `DatabaseWrapper` attributes by [@​filbasi](https://togithub.com/filbasi) in [https://github.com/typeddjango/django-stubs/pull/1544](https://togithub.com/typeddjango/django-stubs/pull/1544) - Improved types for Signal `dispatch.dispatcher` by [@​GabDug](https://togithub.com/GabDug) in [https://github.com/typeddjango/django-stubs/pull/1567](https://togithub.com/typeddjango/django-stubs/pull/1567) - Accept `str` field names for `Window.order_by()`, allow `None` for `asc/desc` arguments by [@​GabDug](https://togithub.com/GabDug) in [https://github.com/typeddjango/django-stubs/pull/1574](https://togithub.com/typeddjango/django-stubs/pull/1574) - Updated many `django.utils.*` types from stubtest by [@​GabDug](https://togithub.com/GabDug) in [https://github.com/typeddjango/django-stubs/pull/1575](https://togithub.com/typeddjango/django-stubs/pull/1575) - Updated many `db.migrations.operations` types from stubtest by [@​GabDug](https://togithub.com/GabDug) in [https://github.com/typeddjango/django-stubs/pull/1583](https://togithub.com/typeddjango/django-stubs/pull/1583) - Added `StepValueValidator`, fixed argument for `SRIDCacheEntry`/`EmailValidator`, improved `urls.resolvers` types by [@​GabDug](https://togithub.com/GabDug) in [https://github.com/typeddjango/django-stubs/pull/1589](https://togithub.com/typeddjango/django-stubs/pull/1589) ##### Plugin changes - Fixed `ForeignKey` queryset filters on un-swapped models by [@​UnknownPlatypus](https://togithub.com/UnknownPlatypus) in [https://github.com/typeddjango/django-stubs/pull/1495](https://togithub.com/typeddjango/django-stubs/pull/1495) - Add `strict_settings` option, allow runtime fallbacks for custom settings by [@​sobolevn](https://togithub.com/sobolevn) in [https://github.com/typeddjango/django-stubs/pull/1557](https://togithub.com/typeddjango/django-stubs/pull/1557) - Add "Settings" section to README by [@​sobolevn](https://togithub.com/sobolevn) in [https://github.com/typeddjango/django-stubs/pull/1581](https://togithub.com/typeddjango/django-stubs/pull/1581) - Automatically reset mypy cache when plugin settings change by [@​sobolevn](https://togithub.com/sobolevn) in [https://github.com/typeddjango/django-stubs/pull/1578](https://togithub.com/typeddjango/django-stubs/pull/1578) - Fixed unhandled exception `KeyError: 'model_bases'` and related errors by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1563](https://togithub.com/typeddjango/django-stubs/pull/1563) ##### django-stubs-ext - Added `TypedDatabaseRouter` as database router base class by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1522](https://togithub.com/typeddjango/django-stubs/pull/1522) ##### CI/testing - CI: Replace isort with Ruff import sorting by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1507](https://togithub.com/typeddjango/django-stubs/pull/1507) - CI: Auto-remove unused imports using Ruff by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1508](https://togithub.com/typeddjango/django-stubs/pull/1508) - CI: Enable Ruff pyupgrade fixes by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1509](https://togithub.com/typeddjango/django-stubs/pull/1509) - CI: Run django-stubs-ext tests in full build matrix by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1552](https://togithub.com/typeddjango/django-stubs/pull/1552) - Remove typecheck test and clean things up by [@​sobolevn](https://togithub.com/sobolevn) in [https://github.com/typeddjango/django-stubs/pull/1556](https://togithub.com/typeddjango/django-stubs/pull/1556) - Add stubtest with lots of errors (currently) by [@​sobolevn](https://togithub.com/sobolevn) in [https://github.com/typeddjango/django-stubs/pull/1560](https://togithub.com/typeddjango/django-stubs/pull/1560) - Removed extra `--generate-allowlist` by [@​sobolevn](https://togithub.com/sobolevn) in [https://github.com/typeddjango/django-stubs/pull/1576](https://togithub.com/typeddjango/django-stubs/pull/1576) ##### Housekeeping - Removed unsupported Django versions from package classifiers by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1553](https://togithub.com/typeddjango/django-stubs/pull/1553) - Removed try-except around import of `ArrayField` by [@​sobolevn](https://togithub.com/sobolevn) in [https://github.com/typeddjango/django-stubs/pull/1558](https://togithub.com/typeddjango/django-stubs/pull/1558) - Reverted: Fix crash when psycopg2 is not installed by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1565](https://togithub.com/typeddjango/django-stubs/pull/1565) - Removed usage of `mypy_extensions` by [@​sobolevn](https://togithub.com/sobolevn) in [https://github.com/typeddjango/django-stubs/pull/1566](https://togithub.com/typeddjango/django-stubs/pull/1566) - Upgrade to Mypy 1.4.0 by [@​christianbundy](https://togithub.com/christianbundy) in [https://github.com/typeddjango/django-stubs/pull/1572](https://togithub.com/typeddjango/django-stubs/pull/1572) - Chore: set Black Python target to 3.8+ explicitely by [@​GabDug](https://togithub.com/GabDug) in [https://github.com/typeddjango/django-stubs/pull/1573](https://togithub.com/typeddjango/django-stubs/pull/1573) - Update `flake8` plugins by [@​sobolevn](https://togithub.com/sobolevn) in [https://github.com/typeddjango/django-stubs/pull/1579](https://togithub.com/typeddjango/django-stubs/pull/1579) - CI: Run tests and pre-commit using newest Python version by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1582](https://togithub.com/typeddjango/django-stubs/pull/1582) - Removed duplicate "import all" test file by [@​adamchainz](https://togithub.com/adamchainz) in [https://github.com/typeddjango/django-stubs/pull/1587](https://togithub.com/typeddjango/django-stubs/pull/1587) - Update compatible-mypy to 1.4.x by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1588](https://togithub.com/typeddjango/django-stubs/pull/1588) - Version 4.2.2 release (django-stubs, django-stubs-ext) by [@​intgr](https://togithub.com/intgr) in [https://github.com/typeddjango/django-stubs/pull/1590](https://togithub.com/typeddjango/django-stubs/pull/1590) #### New Contributors - [@​namper](https://togithub.com/namper) made their first contribution in [https://github.com/typeddjango/django-stubs/pull/1521](https://togithub.com/typeddjango/django-stubs/pull/1521) - [@​filbasi](https://togithub.com/filbasi) made their first contribution in [https://github.com/typeddjango/django-stubs/pull/1544](https://togithub.com/typeddjango/django-stubs/pull/1544) - [@​GabDug](https://togithub.com/GabDug) made their first contribution in [https://github.com/typeddjango/django-stubs/pull/1567](https://togithub.com/typeddjango/django-stubs/pull/1567) - [@​rvanlaar](https://togithub.com/rvanlaar) made their first contribution in [https://github.com/typeddjango/django-stubs/pull/1562](https://togithub.com/typeddjango/django-stubs/pull/1562) **Full Changelog**: typeddjango/django-stubs@4.2.1...4.2.2 </details> --- ### Configuration 📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Enabled. ♻ **Rebasing**: Whenever PR is behind base branch, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNi4xLjExIiwidXBkYXRlZEluVmVyIjoiMzYuMS4xMSIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==--> Co-authored-by: descope[bot] <descope[bot]@users.noreply.github.com>
typeddjango#1495 updated `get_field_related_model_cls` to raise UnregisteredModelError rather than returning `None` for failure paths. However, None can still be returned if the initial retrieval of `related_model_cls` returns None. This patch adds a check to see if the initial retrieval has got a `None` and then raises the appropriate error rather than letting `None` be returned.
typeddjango#1495 updated `get_field_related_model_cls` to raise `UnregisteredModelError` rather than returning `None` for failure paths. However, None can still be returned if the initial retrieval of `related_model_cls` returns None. This patch adds a check to see if the initial retrieval has got a `None` and then raises the appropriate error rather than letting `None` be returned.
typeddjango#1495 updated `get_field_related_model_cls` to raise `UnregisteredModelError` rather than returning `None` for failure paths. However, None can still be returned if the initial retrieval of `related_model_cls` returns None. This patch adds a check to see if the initial retrieval has got a `None` and then raises the appropriate error rather than letting `None` be returned.
typeddjango#1495 updated `get_field_related_model_cls` to raise `UnregisteredModelError` rather than returning `None` for failure paths. However, None can still be returned if the initial retrieval of `related_model_cls` returns None. This patch adds a check to see if the initial retrieval has got a `None` and then raises the appropriate error rather than letting `None` be returned.
typeddjango#1495 updated `get_field_related_model_cls` to raise `UnregisteredModelError` rather than returning `None` for failure paths. However, None can still be returned if the initial retrieval of `related_model_cls` returns None. This patch adds a check to see if the initial retrieval has got a `None` and then raises the appropriate error rather than letting `None` be returned.
typeddjango#1495 updated `get_field_related_model_cls` to raise `UnregisteredModelError` rather than returning `None` for failure paths. However, None can still be returned if the initial retrieval of `related_model_cls` returns None. This patch adds a check to see if the initial retrieval has got a `None` and then raises the appropriate error rather than letting `None` be returned.
#1495 updated `get_field_related_model_cls` to raise `UnregisteredModelError` rather than returning `None` for failure paths. However, None can still be returned if the initial retrieval of `related_model_cls` returns None. This patch adds a check to see if the initial retrieval has got a `None` and then raises the appropriate error rather than letting `None` be returned.
I have made things!
Followup PR to #1436.
I found a reproducible exemple, the first commit should make test fail.
The second should fix it.
Related issues
'self'
-referencing relationship causes crash #626