[CASE test_typechecking_for_model_subclasses] from django.db import models class A(models.Model): pass class B(models.Model): b_attr = 1 pass class C(A): pass def service(a: A) -> int: pass b_instance = B() service(b_instance) # E: Argument 1 to "service" has incompatible type "B"; expected "A" a_instance = A() c_instance = C() service(a_instance) service(c_instance) [/CASE] [CASE fail_if_no_such_attribute_on_model] from django.db import models class B(models.Model): b_attr = 1 pass b_instance = B() reveal_type(b_instance.b_attr) # N: Revealed type is 'builtins.int' reveal_type(b_instance.non_existent_attribute) b_instance.non_existent_attribute = 2 [out] main:10: note: Revealed type is 'Any' main:10: error: "B" has no attribute "non_existent_attribute" main:11: error: "B" has no attribute "non_existent_attribute" [/CASE] [CASE ignore_missing_attributes_if_setting_is_passed] from django.db import models class B(models.Model): pass b_instance = B() reveal_type(b_instance.non_existent_attribute) # N: Revealed type is 'Any' b_instance.non_existent_attribute = 2 [env MYPY_DJANGO_CONFIG=${MYPY_CWD}/mypy_django.ini] [file mypy_django.ini] [[mypy_django_plugin] ignore_missing_model_attributes = True [/CASE]