django-stubs icon indicating copy to clipboard operation
django-stubs copied to clipboard

Could not resolve manager type for "core.models.FooModel.objects" [django-manager-missing]

Open MartinThoma opened this issue 2 years ago • 19 comments

Bug report

I've updated django-stubs-ext from 0.4.0 to 0.5.0 and got a lof of error messages from mypy. Before, mypy didn't complain

There might actually be nothing wrong with django-stubs, but maybe I need to add a type annotation. The problem is that I have no idea what I need to change.

The code has many unit tests. It's very unlikely that all of those locations mypy now complains about actually have issues that would prevent proper code execution.

What's wrong

mypy shows several django-manager-missing errors.

How is that should be

No mypy errors shown

System information

  • OS: Ubuntu
  • python version: 3.8
  • django version: 3.2
  • mypy version: 0.942
  • django-stubs version: 1.12.0
  • django-stubs-ext version: 0.5.0

MartinThoma avatar Jun 27 '22 06:06 MartinThoma

I have been getting the same error and I think it might be related to #1022

jose-reveni avatar Jun 27 '22 08:06 jose-reveni

I wouldn't directly say it's related to #1022, unless you're seeing that error too.

The error you're seeing was intentionally introduced in #999.

I'd start with investigating the types for your model managers. I think manager names are outputted in the errors you're seeing?

Could you display how you set up one of those managers generating the error?

flaeppe avatar Jun 27 '22 09:06 flaeppe

I didn't setup any manager explicitly for those models.

I create those models like this:

from django.db import models
import uuid

class Base(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)

class FooModel(Base):
    foo = models.CharField(max_length=100)
    bar = models.BooleanField()

And I use it like this: FooModel.objects.all().

There is, of course, way more going on, but that is the gist of it. I can try to make a minimal example with pinned dependencies some time this week if that helps.

MartinThoma avatar Jun 27 '22 09:06 MartinThoma

Interesting, I'm pretty certain we have test cases covering non-explicit managers.

But I'll double check that.

A minimal example would be helpful too!

flaeppe avatar Jun 27 '22 09:06 flaeppe

UUID might hack itself onto the base manager of models that use it, perhaps? Similar to the way django money was found to be behaving.

aleksanb avatar Jun 27 '22 09:06 aleksanb

I actually also use Django money. I thought it was not related :thinking:

MartinThoma avatar Jun 27 '22 09:06 MartinThoma

Hm, one important lead would be what the type the manager is during runtime.

@MartinThoma since it's an implicit manager. Could you investigate what type(FooModel.objects) outputs?

flaeppe avatar Jun 27 '22 09:06 flaeppe

I actually also use Django money. I thought it was not related :thinking:

Then it could be related to https://github.com/typeddjango/django-stubs/pull/993#issuecomment-1155151881

flaeppe avatar Jun 27 '22 09:06 flaeppe

Using the interactive shell:

>>> type(FooModel.objects)
djmoney.models.managers.money_manager.<locals>.MoneyManager

MartinThoma avatar Jun 27 '22 09:06 MartinThoma

I'm using django-money==3.0.0

MartinThoma avatar Jun 27 '22 09:06 MartinThoma

Then it's definitely related to https://github.com/typeddjango/django-stubs/pull/993#issuecomment-1155151881 and django-money not exporting types.

I'm afraid it's not much to do other than ignoring the error until django-money starts to export types. At least as far as I'm aware

flaeppe avatar Jun 27 '22 11:06 flaeppe

Our case is something like

class UUIDPrimaryKeyAbstractModel(models.Model):
    id = models.UUIDField(primary_key=True, unique=True, default=uuid.uuid4, editable=False)

    class Meta:
        abstract = True


class Foo(UUIDPrimaryKeyAbstractModel):
    pass


class Bar(UUIDPrimaryKeyAbstractModel):
    foo = models.ForeignKey(Foo, on_delete=models.CASCADE)

No django-money.

rr- avatar Jul 04 '22 20:07 rr-

I would like to add that we have the same issue with another untyped library that provides Model base classes.

Since it is not possible to suppress the error in mypy and there seems to be no other workaround, this is a complete blocker for us to switch to 1.12.0

tilsche avatar Jul 08 '22 10:07 tilsche

Hi, I'm also using django-money==3.0.0 and I bump into the same problem. It actually blocks me from updating not only the django-stubs version but the mypy one as well.

Is there any temporary workaround?

martin056 avatar Jul 12 '22 06:07 martin056

Then it's definitely related to #993 (comment) and django-money not exporting types.

I'm afraid it's not much to do other than ignoring the error until django-money starts to export types. At least as far as I'm aware

I tried forking the repo and adding the required py.typed. That didn't immediately work, so I tried adding some strategic type hints, but no luck.

After looking at how django-money overrides managers though, I'm not confident this actually can be fixed by exporting types.

Essentially what django-money does is subscribe to the class_prepared signal, so it receives all the django models in the project on startup, here. Then, if the model has a money-field, it dynamically patches the manager here, like this.

This, to me, seems impossible to type hint. Do you agree, or am I missing something? Hoping for the latter :crossed_fingers: :slightly_smiling_face:

sondrelg avatar Oct 14 '22 15:10 sondrelg

I am running into this problem when using django-modeltranslation.

type(Model.objects) returns <class 'modeltranslation.manager.MultilingualManager'>.

Is there any workaround that I could do or is this something that would need to be fixed within django-modeltranslation?

mschoettle avatar Dec 29 '22 14:12 mschoettle

Having the same issue as @mschoettle , using django-modeltranslation and getting the django-manager-missing error

HitLuca avatar Mar 10 '23 14:03 HitLuca

Same issue with django-modeltrans. Ive opened an issue there but I just found this one.

In case it helps, I've got a minimal project reproducing the issue with that library: https://github.com/browniebroke/modeltrans-mypy-bug

browniebroke avatar Apr 17 '23 15:04 browniebroke