Skip to content

Commit b48839d

Browse files
committed
the ForeignKey references argument wil now extract the module path from a string
1 parent 1c6c00a commit b48839d

File tree

3 files changed

+28
-4
lines changed

3 files changed

+28
-4
lines changed

piccolo/columns/column_types.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -960,6 +960,9 @@ class Band(Table):
960960
table_class_name="Manager",
961961
module_path="some_module.tables",
962962
)
963+
# Alternatively, Piccolo will interpret this string as
964+
# the same as above:
965+
# references="some_module.tables.Manager"
963966
)
964967
965968
:param on_delete:

piccolo/table.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,8 +199,17 @@ def __init_subclass__(
199199
if references == "self":
200200
references = cls
201201
else:
202+
if "." in references:
203+
module_path, table_class_name = references.rsplit(
204+
".", maxsplit=1
205+
)
206+
else:
207+
table_class_name = references
208+
module_path = cls.__module__
209+
202210
references = LazyTableReference(
203-
table_class_name=references, module_path=cls.__module__
211+
table_class_name=table_class_name,
212+
module_path=module_path,
204213
)
205214

206215
is_lazy = isinstance(references, LazyTableReference)

tests/columns/test_foreignkey.py

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ class Band3(Table):
2727
)
2828

2929

30+
class Band4(Table):
31+
manager = ForeignKey(references="tests.columns.test_foreignkey.Manager")
32+
33+
3034
class TestForeignKeySelf(TestCase):
3135
"""
3236
Test that ForeignKey columns can be created with references to the parent
@@ -68,15 +72,21 @@ class TestForeignKeyString(TestCase):
6872

6973
def setUp(self):
7074
Manager.create_table().run_sync()
71-
Band2.create_table().run_sync()
7275

7376
def test_foreign_key_string(self):
77+
Band2.create_table().run_sync()
7478
self.assertEqual(
7579
Band2.manager._foreign_key_meta.resolved_references, Manager
7680
)
81+
Band2.alter().drop_table().run_sync()
82+
83+
Band4.create_table().run_sync()
84+
self.assertEqual(
85+
Band4.manager._foreign_key_meta.resolved_references, Manager
86+
)
87+
Band4.alter().drop_table().run_sync()
7788

7889
def tearDown(self):
79-
Band2.alter().drop_table().run_sync()
8090
Manager.alter().drop_table().run_sync()
8191

8292

@@ -86,11 +96,12 @@ def test_foreign_key_references(self):
8696
Make sure foreign key references are stored correctly on the table
8797
which is the target of the ForeignKey.
8898
"""
89-
self.assertEqual(len(Manager._meta.foreign_key_references), 4)
99+
self.assertEqual(len(Manager._meta.foreign_key_references), 5)
90100

91101
self.assertTrue(Band1.manager in Manager._meta.foreign_key_references)
92102
self.assertTrue(Band2.manager in Manager._meta.foreign_key_references)
93103
self.assertTrue(Band3.manager in Manager._meta.foreign_key_references)
104+
self.assertTrue(Band4.manager in Manager._meta.foreign_key_references)
94105
self.assertTrue(
95106
Manager.manager in Manager._meta.foreign_key_references
96107
)
@@ -118,6 +129,7 @@ def test_attribute_access(self):
118129
self.assertTrue(isinstance(Band1.manager.name, Varchar))
119130
self.assertTrue(isinstance(Band2.manager.name, Varchar))
120131
self.assertTrue(isinstance(Band3.manager.name, Varchar))
132+
self.assertTrue(isinstance(Band4.manager.name, Varchar))
121133

122134
def test_recursion_limit(self):
123135
"""

0 commit comments

Comments
 (0)