Opened 9 months ago
Closed 8 months ago
#36188 closed Bug (invalid)
Reverse lookups on OneToOneField not working?
| Reported by: | Willem Van Onsem | Owned by: | hesham hatem |
|---|---|---|---|
| Component: | Database layer (models, ORM) | Version: | 5.1 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Unreviewed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
This StackOverflow post shows a scenario where a OneToOneField is filtered on top of another OneToOneField. So for example with the following modeling:
class Switch(models.Model):
fqdn = models.CharField(max_length=45, unique=True)
class ConfigState(models.Model):
switch = models.OneToOneField(Switch, models.CASCADE, db_column='switch', primary_key=True,
related_name='config_state')
class EdgeSwitch(models.Model):
switch = models.OneToOneField(Switch, models.CASCADE, db_column='switch', primary_key=True,
related_name='edge_switch')
The query EdgeSwitch.objects.filter(switch__config_state=1) does (no longer) work. On Django-3.x it apparently worked.
Change History (5)
comment:2 by , 8 months ago
| Owner: | set to |
|---|---|
| Status: | new → assigned |
comment:3 by , 8 months ago
| Resolution: | → invalid |
|---|---|
| Status: | assigned → closed |
I cannot reproduce the issue against main or stable/5.1.x with the following patch based on the provided models
-
new file tests/ticket_36188/models.py
diff --git a/tests/ticket_36188/__init__.py b/tests/ticket_36188/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/ticket_36188/models.py b/tests/ticket_36188/models.py new file mode 100644 index 0000000000..c6a6ee01bc
- + 1 from django.db import models 2 3 4 class Switch(models.Model): 5 fqdn = models.CharField(max_length=45, unique=True) 6 7 8 class ConfigState(models.Model): 9 switch = models.OneToOneField( 10 Switch, 11 models.CASCADE, 12 db_column="switch", 13 primary_key=True, 14 related_name="config_state", 15 ) 16 17 18 class EdgeSwitch(models.Model): 19 switch = models.OneToOneField( 20 Switch, 21 models.CASCADE, 22 db_column="switch", 23 primary_key=True, 24 related_name="edge_switch", 25 ) -
new file tests/ticket_36188/tests.py
diff --git a/tests/ticket_36188/tests.py b/tests/ticket_36188/tests.py new file mode 100644 index 0000000000..dbfdd6bb7b
- + 1 from django.test import TestCase 2 3 from .models import EdgeSwitch 4 5 6 class Ticket36188Tests(TestCase): 7 def test_reported_case(self): 8 list(EdgeSwitch.objects.filter(switch__config_state=1)) 9 print(EdgeSwitch.objects.filter(switch__config_state=1).query)
Please re-open if you can provide a set of models that trigger a FieldError.
comment:4 by , 8 months ago
| Resolution: | invalid |
|---|---|
| Status: | closed → new |
I found the missing part: the Switch model needs to have managed = False. A bit curious that this has impact, so:
class Switch(models.Model):
fqdn = models.CharField(max_length=45, unique=True)
class Meta:
managed = False
comment:5 by , 8 months ago
| Resolution: | → invalid |
|---|---|
| Status: | new → closed |
I think I got it, the tables got an app_label, but that was probably not registered.
Can i take this ticket?