Skip to content
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

Merged
merged 7 commits into from
Jun 16, 2023

Conversation

UnknownPlatypus
Copy link
Contributor

@UnknownPlatypus UnknownPlatypus commented May 12, 2023

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

@UnknownPlatypus UnknownPlatypus marked this pull request as draft May 12, 2023 19:28
@UnknownPlatypus
Copy link
Contributor Author

Marking as draft for tonight, will check the typing issue later this weekend

@UnknownPlatypus UnknownPlatypus marked this pull request as ready for review May 24, 2023 08:13
@@ -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)
Copy link
Member

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?

Copy link
Contributor Author

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 👍

Copy link
Contributor Author

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?

@UnknownPlatypus
Copy link
Contributor Author

UnknownPlatypus commented Jun 16, 2023

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 get_field_related_model_cls, this lead to some nice simplifications but I'm still not sure this is the best way to deal with this.

The diff is a bit bigger because of that, let me know if this seems reasonable to you.
I'll be more available in the following days to take any feedback

EDIT: hum, test are passing locally, will investigate further.
Edit2: I had django 3 instead of django 4 installed, hence the test passing locally

Copy link
Member

@sobolevn sobolevn left a 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!

@intgr
Copy link
Collaborator

intgr commented Jun 16, 2023

FWIW, I only have little experience working on plugin code, but I had the same feeling: checking for and passing None values up the stack felt unwieldy. I prefer the exception approach. 👍

@sobolevn sobolevn merged commit e778561 into typeddjango:master Jun 16, 2023
@UnknownPlatypus UnknownPlatypus deleted the fix-issue-626 branch July 1, 2023 22:43
descope bot referenced this pull request in descope/django-descope Jul 18, 2023
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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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 [@&#8203;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
[@&#8203;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 [@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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 [@&#8203;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
[@&#8203;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 [@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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 [@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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 [@&#8203;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
[@&#8203;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
[@&#8203;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 [@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;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
[@&#8203;intgr](https://togithub.com/intgr) in
[https://github.com/typeddjango/django-stubs/pull/1590](https://togithub.com/typeddjango/django-stubs/pull/1590)

#### New Contributors

- [@&#8203;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)
- [@&#8203;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)
- [@&#8203;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)
- [@&#8203;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>
SingingTree added a commit to SingingTree/django-stubs that referenced this pull request Feb 18, 2024
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.
SingingTree added a commit to SingingTree/django-stubs that referenced this pull request Feb 18, 2024
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.
SingingTree added a commit to SingingTree/django-stubs that referenced this pull request Feb 19, 2024
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.
SingingTree added a commit to SingingTree/django-stubs that referenced this pull request Feb 19, 2024
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.
SingingTree added a commit to SingingTree/django-stubs that referenced this pull request Feb 25, 2024
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.
SingingTree added a commit to SingingTree/django-stubs that referenced this pull request Feb 25, 2024
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.
sobolevn pushed a commit that referenced this pull request Feb 25, 2024
#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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

'self'-referencing relationship causes crash
3 participants