Opened 6 years ago
Last modified 6 years 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 by , 6 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:2 by , 6 years ago
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.
comment:3 by , 6 years ago
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?
Reproduced at 741792961815cf4a95c5ce8ab590dfc7700c6153.