Opened 7 years ago
Last modified 7 years ago
#29466 new Bug
Textual "to" parameter of ForeignKey fails to resolve if placed in abstract model
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)
According to the ticket's flags, the next step(s) to move this issue forward are:
- To provide a patch by sending a pull request. Claim the ticket when you start working so that someone else doesn't duplicate effort. Before sending a pull request, review your work against the patch review checklist. Check the "Has patch" flag on the ticket after sending a pull request and include a link to the pull request in the ticket comment when making that update. The usual format is:
[https://github.com/django/django/pull/#### PR]
.
Change History (3)
comment:1 by , 7 years ago
Triage Stage: | Unreviewed → Accepted |
---|
comment:2 by , 7 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 (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.
comment:3 by , 7 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.