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)
}}}
--
Ticket URL: <https://code.djangoproject.com/ticket/29466>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
* stage: Unreviewed => Accepted
Comment:
Reproduced at 741792961815cf4a95c5ce8ab590dfc7700c6153.
--
Ticket URL: <https://code.djangoproject.com/ticket/29466#comment:1>
Comment (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 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 would not
change the triage stage as I am not sure about this.
--
Ticket URL: <https://code.djangoproject.com/ticket/29466#comment:2>
Comment (by Vitalik Verhovodov):
Sound 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?
--
Ticket URL: <https://code.djangoproject.com/ticket/29466#comment:3>