Skip to content

Commit da5248e

Browse files
authored
Use related_name for MTO queries (#123)
1 parent 62ea6f1 commit da5248e

9 files changed

+87
-5
lines changed

CHANGELOG.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@ Using the following categories, list your changes in this order:
2222

2323
## [Unreleased]
2424

25-
- Nothing (yet)
25+
### Fixed
26+
27+
- `use_query` will now utilize `field.related_name` when postprocessing many-to-one relationships
2628

2729
## [2.2.1] - 2022-01-09
2830

pyproject.toml

+1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ ensure_newline_before_comments = "True"
1010
include_trailing_comma = "True"
1111
line_length = 88
1212
lines_after_imports = 2
13+
extend_skip_glob = ["*/migrations/*"]
1314

1415
[tool.mypy]
1516
ignore_missing_imports = true

src/django_idom/utils.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,7 @@ def django_query_postprocessor(
232232
getattr(data, field.name)
233233

234234
if many_to_one and type(field) == ManyToOneRel:
235-
prefetch_fields.append(f"{field.name}_set")
235+
prefetch_fields.append(field.related_name or f"{field.name}_set")
236236

237237
elif many_to_many and isinstance(field, ManyToManyField):
238238
prefetch_fields.append(field.name)

tests/test_app/components.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ def relational_query():
199199

200200
mtm = relational_parent.data.many_to_many.all()
201201
oto = relational_parent.data.one_to_one
202-
mto = relational_parent.data.foriegnchild_set.all()
202+
mto = relational_parent.data.many_to_one.all()
203203
fk = foriegn_child.data.parent
204204

205205
return html.div(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
# Generated by Django 4.1.5 on 2023-01-13 23:23
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("test_app", "0002_relationalchild_relationalparent_foriegnchild"),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name="foriegnchild",
16+
name="parent",
17+
field=models.ForeignKey(
18+
on_delete=django.db.models.deletion.CASCADE,
19+
related_name="parent",
20+
to="test_app.relationalparent",
21+
),
22+
),
23+
migrations.AlterField(
24+
model_name="relationalparent",
25+
name="one_to_one",
26+
field=models.OneToOneField(
27+
null=True,
28+
on_delete=django.db.models.deletion.SET_NULL,
29+
related_name="one_to_one",
30+
to="test_app.relationalchild",
31+
),
32+
),
33+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 4.1.5 on 2023-01-13 23:28
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("test_app", "0003_alter_foriegnchild_parent_and_more"),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name="foriegnchild",
16+
name="parent",
17+
field=models.ForeignKey(
18+
on_delete=django.db.models.deletion.CASCADE,
19+
related_name="foriegn_child",
20+
to="test_app.relationalparent",
21+
),
22+
),
23+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# Generated by Django 4.1.5 on 2023-01-13 23:38
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
("test_app", "0004_alter_foriegnchild_parent"),
11+
]
12+
13+
operations = [
14+
migrations.AlterField(
15+
model_name="foriegnchild",
16+
name="parent",
17+
field=models.ForeignKey(
18+
on_delete=django.db.models.deletion.CASCADE,
19+
related_name="many_to_one",
20+
to="test_app.relationalparent",
21+
),
22+
),
23+
]

tests/test_app/models.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@ class RelationalParent(models.Model):
2020

2121
class ForiegnChild(models.Model):
2222
text = models.CharField(max_length=1000) # type: ignore
23-
parent = models.ForeignKey(RelationalParent, on_delete=models.CASCADE) # type: ignore
23+
parent = models.ForeignKey(RelationalParent, related_name="many_to_one", on_delete=models.CASCADE) # type: ignore

tests/test_app/tests/test_components.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def setUpClass(cls):
1616
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
1717

1818
# FIXME: This is required otherwise the tests will throw a `SynchronousOnlyOperation`
19-
# error when deleting the test datatabase. Potentially a Django bug.
19+
# error when discarding the test datatabase. Potentially a `ChannelsLiveServerTestCase` bug.
2020
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
2121

2222
super().setUpClass()

0 commit comments

Comments
 (0)