Improve typing for unresolved managers (#1044)

* Improve typing for unresolved managers

This changes the logic when encountering an unresolvable manager class.
Instead of adding it as a `Manager` we create a subclass of `Manager`
that has `fallback_to_any=True` set. Similarly a `QuerySet` class is
created that also has fallbacks to `Any`. This allows calling custom
methods on the manager and querysets without getting type errors.

* Fix manager created and improve a test

* Fix row type of FallbackQuerySet

Because this inherits from _QuerySet, not QuerySet, it needs to have two
parameters
This commit is contained in:
Sigurd Ljødal
2022-07-18 08:13:46 +02:00
committed by GitHub
parent 830d74b493
commit e7a89f73c4
4 changed files with 164 additions and 37 deletions

View File

@@ -678,18 +678,24 @@
def custom(self) -> None:
pass
def TransactionManager():
return BaseManager.from_queryset(TransactionQuerySet)()
class Transaction(models.Model):
objects = BaseManager.from_queryset(TransactionQuerySet)
objects = TransactionManager()
def test(self) -> None:
reveal_type(self.transactionlog_set)
# We use a fallback Any type:
reveal_type(Transaction.objects)
reveal_type(Transaction.objects.custom())
class TransactionLog(models.Model):
transaction = models.ForeignKey(Transaction, on_delete=models.CASCADE)
out: |
myapp/models:10: note: Revealed type is "django.db.models.manager.RelatedManager[myapp.models.TransactionLog]"
myapp/models:12: note: Revealed type is "Any"
myapp/models:11: error: Could not resolve manager type for "myapp.models.Transaction.objects"
myapp/models:13: note: Revealed type is "django.db.models.manager.RelatedManager[myapp.models.TransactionLog]"
myapp/models:15: note: Revealed type is "myapp.models.UnknownManager[myapp.models.Transaction]"
myapp/models:16: note: Revealed type is "Any"
- case: resolve_primary_keys_for_foreign_keys_with_abstract_self_model