Skip to content

Commit 90d3355

Browse files
Fix missing relations for models with ManyToManyField fields (#205)
1 parent c8dcd86 commit 90d3355

File tree

3 files changed

+123
-20
lines changed

3 files changed

+123
-20
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Please use [this](https://docs.gitlab.com/ee/development/changelog.html) documen
77
### Fixed
88

99
* demos: Tezos Domains and Homebase DAO demos were updated from edo2net to mainnet contracts.
10+
* hasura: Fixed missing relations for models with `ManyToManyField` fields.
1011

1112
### Performance
1213

poetry.lock

Lines changed: 86 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/dipdup/hasura.py

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -274,20 +274,53 @@ async def _generate_source_tables_metadata(self) -> List[Dict[str, Any]]:
274274
if isinstance(field, fields.relational.ForeignKeyFieldInstance):
275275
if not isinstance(field.related_name, str):
276276
raise HasuraError(f'`related_name` of `{field}` must be set')
277+
277278
related_table_name = model_tables[field.model_name]
279+
field_name = field.model_field_name
278280
metadata_tables[table_name]['object_relationships'].append(
279281
self._format_object_relationship(
280-
name=field.model_field_name,
281-
column=field.model_field_name + '_id',
282+
name=field_name,
283+
column=field_name + '_id',
282284
)
283285
)
284286
metadata_tables[related_table_name]['array_relationships'].append(
285287
self._format_array_relationship(
286288
related_name=field.related_name,
287289
table=table_name,
288-
column=field.model_field_name + '_id',
290+
column=field_name + '_id',
291+
)
292+
)
293+
294+
elif isinstance(field, fields.relational.ManyToManyFieldInstance):
295+
if not isinstance(field.related_name, str):
296+
raise HasuraError(f'`related_name` of `{field}` must be set')
297+
298+
related_table_name = model_tables[field.model_name]
299+
junction_table_name = field.through
300+
301+
metadata_tables[junction_table_name] = self._format_table(junction_table_name)
302+
metadata_tables[junction_table_name]['object_relationships'].append(
303+
self._format_object_relationship(
304+
name=related_table_name,
305+
column=related_table_name + '_id',
289306
)
290307
)
308+
metadata_tables[junction_table_name]['object_relationships'].append(
309+
self._format_object_relationship(
310+
name=table_name,
311+
column=table_name + '_id',
312+
)
313+
)
314+
metadata_tables[related_table_name]['array_relationships'].append(
315+
self._format_array_relationship(
316+
related_name=f'{related_table_name}_{field.related_name}',
317+
table=junction_table_name,
318+
column=related_table_name + '_id',
319+
)
320+
)
321+
322+
else:
323+
pass
291324

292325
return list(metadata_tables.values())
293326

0 commit comments

Comments
 (0)