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 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 , 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.