Skip to content

Commit ddbc70a

Browse files
authored
add support for related_query_name (#610)
1 parent e02d655 commit ddbc70a

File tree

4 files changed

+47
-3
lines changed

4 files changed

+47
-3
lines changed

iommi/from_model.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,10 +169,12 @@ def get_field_name(field: DjangoField) -> str:
169169
if isinstance(field, ManyToManyRel):
170170
return field.related_name
171171
elif isinstance(field, ManyToOneRel):
172-
if field.related_name:
173-
return field.related_name
174-
elif field.related_name == '+':
172+
if field.related_name == '+':
175173
return None
174+
elif field.related_query_name:
175+
return field.related_query_name
176+
elif field.related_name:
177+
return field.related_name
176178
elif isinstance(field, OneToOneRel):
177179
return field.name
178180
else:

iommi/query__tests.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,7 @@ def test_from_model_with_model_class():
699699
'id',
700700
'foo',
701701
'bars',
702+
'qux',
702703
'fieldfrommodelforeignkeytest_set',
703704
'fieldfrommodelonetoonetest',
704705
'createoreditobjecttest_set',
@@ -713,6 +714,7 @@ def test_from_model_with_queryset():
713714
'id',
714715
'foo',
715716
'bars',
717+
'qux',
716718
'fieldfrommodelforeignkeytest_set',
717719
'fieldfrommodelonetoonetest',
718720
'createoreditobjecttest_set',

iommi/table__tests.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
DefaultsInForms,
9595
FieldFromModelOneToOneTest,
9696
Foo,
97+
Qux,
9798
FromModelWithInheritanceTest,
9899
QueryFromIndexesTestModel,
99100
SortKeyOnForeignKeyB,
@@ -3708,6 +3709,35 @@ def test_auto_model_dunder_path_1to1_reverse():
37083709
assert "fieldfrommodelonetoonetest_f_char" in keys(table.columns)
37093710

37103711

3712+
@pytest.mark.django_db
3713+
def test_custom_related_query_name():
3714+
foo = Foo.objects.create(foo=1)
3715+
Qux.objects.create(foo=foo, lang='en', name='first english item')
3716+
Qux.objects.create(foo=foo, lang='cs', name='první česká položka')
3717+
foo2 = Foo.objects.create(foo=1)
3718+
Qux.objects.create(foo=foo2, lang='en', name='second english item')
3719+
Qux.objects.create(foo=foo2, lang='cs', name='druhá česká položka')
3720+
3721+
table = Table(
3722+
auto__model=Foo,
3723+
auto__include=['qux__name'],
3724+
rows=Foo.objects.prefetch_related('quxes').filter(qux__lang='en'),
3725+
columns__qux_name__filter__include=True,
3726+
columns__qux_name__filter__freetext=True,
3727+
)
3728+
3729+
bound_table1 = table.bind(request=req('get', freetext_search='first'))
3730+
assert 'qux_name' in keys(bound_table1.columns)
3731+
assert len(bound_table1.get_visible_rows()) == 1
3732+
bound_table1.__html__()
3733+
3734+
bound_table2 = table.bind(request=req('get', order='-qux_name'))
3735+
assert 'qux_name' in keys(bound_table2.columns)
3736+
assert len(bound_table2.get_visible_rows()) == 2
3737+
assert bound_table2.get_visible_rows().first().qux.name == 'second english item'
3738+
bound_table2.__html__()
3739+
3740+
37113741
@pytest.mark.django_db
37123742
def test_invalid_form_message():
37133743
invalid_form_message = 'Seventh Star'

tests/models.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ class Foo(Model):
3232
def __repr__(self):
3333
return f'Foo pk: {self.pk}' # pragma: no cover
3434

35+
@property
36+
def qux(self):
37+
return self.quxes.first()
38+
3539

3640
class Bar(Model):
3741
foo = ForeignKey(Foo, related_name='bars', on_delete=CASCADE, help_text='bar_help_text')
@@ -41,6 +45,12 @@ class FieldFromModelForeignKeyTest(Model):
4145
foo_fk = ForeignKey(Foo, on_delete=CASCADE)
4246

4347

48+
class Qux(Model):
49+
foo = ForeignKey(Foo, related_name='quxes', related_query_name='qux', on_delete=CASCADE)
50+
lang = models.CharField(max_length=7)
51+
name = CharField(max_length=255, blank=True)
52+
53+
4454
class FieldFromModelOneToOneTest(Model):
4555
foo_one_to_one = OneToOneField(Foo, on_delete=CASCADE)
4656
f_char = CharField(max_length=255, blank=True)

0 commit comments

Comments
 (0)