Skip to content

Commit 4fed594

Browse files
authored
fix foreign keys in in auto migrations (piccolo-orm#173)
* fix foreign keys in in auto migrations * make sure additional imports are included for pk column
1 parent 14e7c72 commit 4fed594

File tree

2 files changed

+35
-2
lines changed

2 files changed

+35
-2
lines changed

piccolo/apps/migrations/auto/serialisation.py

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,20 @@ def __eq__(self, other):
9999
def __repr__(self):
100100
tablename = self.table_type._meta.tablename
101101
class_name = self.table_type.__name__
102-
return f'class {class_name}(Table, tablename="{tablename}"): pass'
102+
103+
# We have to add the primary key column definition too, so foreign
104+
# keys can be created with the correct type.
105+
pk_column = self.table_type._meta.primary_key
106+
pk_column_name = pk_column._meta.name
107+
serialised_pk_column = SerialisedColumnInstance(
108+
pk_column,
109+
serialised_params=serialise_params(params=pk_column._meta.params),
110+
)
111+
112+
return (
113+
f'class {class_name}(Table, tablename="{tablename}"): '
114+
f"{pk_column_name} = {serialised_pk_column}"
115+
)
103116

104117
def __lt__(self, other):
105118
return repr(self) < repr(other)
@@ -322,6 +335,21 @@ def serialise_params(params: t.Dict[str, t.Any]) -> SerialisedParams:
322335
extra_imports.append(
323336
Import(module=Table.__module__, target="Table")
324337
)
338+
339+
extra_imports.append(
340+
Import(
341+
module=value._meta.primary_key.__class__.__module__,
342+
target=value._meta.primary_key.__class__.__name__,
343+
)
344+
)
345+
# Include the extra imports and definitions required for the
346+
# primary column params.
347+
pk_serialised_params: SerialisedParams = serialise_params(
348+
params=value._meta.primary_key._meta.params
349+
)
350+
extra_imports.extend(pk_serialised_params.extra_imports)
351+
extra_definitions.extend(pk_serialised_params.extra_definitions)
352+
325353
continue
326354

327355
# Plain class type

tests/apps/migrations/auto/test_serialisation.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,12 @@ def test_lazy_table_reference(self):
6464
self.assertTrue(len(serialised.extra_definitions) == 1)
6565
self.assertEqual(
6666
serialised.extra_definitions[0].__str__(),
67-
'class Manager(Table, tablename="manager"): pass',
67+
(
68+
'class Manager(Table, tablename="manager"): '
69+
"id = Serial(null=False, primary_key=True, unique=False, "
70+
"index=False, index_method=IndexMethod.btree, "
71+
"choices=None)"
72+
),
6873
)
6974

7075
def test_function(self):

0 commit comments

Comments
 (0)