diff --git a/mypy_django_plugin/plugins/related_fields.py b/mypy_django_plugin/plugins/related_fields.py index 5709b41..df3e4c9 100644 --- a/mypy_django_plugin/plugins/related_fields.py +++ b/mypy_django_plugin/plugins/related_fields.py @@ -48,10 +48,7 @@ def get_valid_to_value_or_none(ctx: FunctionContext) -> Optional[Instance]: referred_to_type = arg_type.ret_type if not isinstance(referred_to_type, Instance): return None - for base in referred_to_type.type.bases: - if base.type.fullname() == helpers.MODEL_CLASS_FULLNAME: - break - else: + if not referred_to_type.type.has_base(helpers.MODEL_CLASS_FULLNAME): ctx.api.msg.fail(f'to= parameter value must be ' f'a subclass of {helpers.MODEL_CLASS_FULLNAME}', context=ctx.context) diff --git a/test-data/typecheck/related_fields.test b/test-data/typecheck/related_fields.test index 237415b..4be10e8 100644 --- a/test-data/typecheck/related_fields.test +++ b/test-data/typecheck/related_fields.test @@ -228,3 +228,14 @@ class User(models.Model): friends = models.ManyToManyField('self', on_delete=models.CASCADE) reveal_type(User().friends) # E: Revealed type is 'django.db.models.manager.RelatedManager[main.User*]' [out] + +[CASE recursively_checking_for_base_model_in_to_parameter] +from django.db import models + +class BaseModel(models.Model): + pass +class ParkingSpot(BaseModel): + pass +class Booking(BaseModel): + parking_spot = models.ForeignKey(to=ParkingSpot, null=True, on_delete=models.SET_NULL) +[out]