Opened 3 weeks ago

Last modified 11 days ago

#29466 new Bug

Textual "to" parameter of ForeignKey fails to resolve if placed in abstract model

Reported by: Vitalik Verhovodov Owned by: nobody
Component: Database layer (models, ORM) Version: 2.0
Severity: Normal Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

import django
from django.conf import settings

settings.configure(DEBUG=True)
django.setup()

from django.db import models


SHOULD_I_FAIL = True  # switch this to reproduce the bug


class ReferencedModel(models.Model):
    field = models.FloatField()

    class Meta:
        app_label = 'myapp'


ref = 'ReferencedModel' if SHOULD_I_FAIL else ReferencedModel


class AbstractModel(models.Model):
    # NOTE: only abstract models are affected
    field = models.ForeignKey(ref, on_delete=models.CASCADE)

    class Meta:
        abstract = True
        app_label = 'myapp'


class RealModel(AbstractModel):
    other_field = models.CharField(max_length=100)

    class Meta:
        app_label = 'myapp'


ffield = AbstractModel._meta.get_field('field')
# ValueError: Related model 'ReferencedModel' cannot be resolved
print(ffield.target_field)

Change History (3)

comment:1 Changed 13 days ago by Tim Graham

Triage Stage: UnreviewedAccepted

comment:2 Changed 11 days ago by Alexander Tatarinov

I will assume that this is intended behavior. According to #24215, abstract models does not register pending lookups into Apps registry. I have tried to implement it, but found an issue with recursive relations in abstract model - they cannot be resolved (because abstract models is not registered), but it is valid to have them, because they can be resolved in concrete children classes. So for abstract models lazy-referenced relations should not be resolved. I am not sure about this, need someone more proficient to take a look.

Last edited 11 days ago by Alexander Tatarinov (previous) (diff)

comment:3 Changed 11 days ago by Vitalik Verhovodov

Sounds reasonable, but what if I'm sure that all models are already loaded (e.g. during Command execution)? How can I manually resolve textual model name and target_field?

Last edited 11 days ago by Vitalik Verhovodov (previous) (diff)
Note: See TracTickets for help on using tickets.
Back to Top