@@ -83,6 +83,15 @@ class Item(TestModel):
83
83
basket = ForeignKeyField (Basket )
84
84
85
85
86
+ class NodeTag (TestModel ):
87
+ tag = TextField ()
88
+
89
+ class Node (TestModel ):
90
+ name = TextField ()
91
+ tag = ForeignKeyField (NodeTag )
92
+ parent = ForeignKeyField ('self' , null = True , backref = 'children' )
93
+
94
+
86
95
class TestModelToDict (ModelTestCase ):
87
96
database = get_in_memory_db ()
88
97
requires = [User , Tweet , Tag , TweetTag ]
@@ -91,6 +100,44 @@ def setUp(self):
91
100
super (TestModelToDict , self ).setUp ()
92
101
self .user = User .create (username = 'peewee' )
93
102
103
+ @requires_models (Node , NodeTag )
104
+ def test_self_referential (self ):
105
+ a , b = [NodeTag .create (tag = tag ) for tag in 'ab' ]
106
+ root = Node .create (name = 'root' , tag = a )
107
+ n1 = Node .create (name = 'n1' , parent = root , tag = a )
108
+ n2 = Node .create (name = 'n2' , parent = root , tag = b )
109
+ Parent = Node .alias ('parent' )
110
+ ParentTag = NodeTag .alias ('parent_tag' )
111
+
112
+ def assertSerialization (n , expected ):
113
+ obj = (Node
114
+ .select (Node , NodeTag , Parent , ParentTag )
115
+ .join_from (Node , NodeTag , JOIN .LEFT_OUTER )
116
+ .join_from (Node , Parent , JOIN .LEFT_OUTER )
117
+ .join_from (Parent , ParentTag , JOIN .LEFT_OUTER )
118
+ .where (Node .name == n )
119
+ .first ())
120
+
121
+ self .assertEqual (model_to_dict (obj , recurse = True ), expected )
122
+
123
+ assertSerialization ('n1' , {
124
+ 'id' : n1 .id ,
125
+ 'name' : 'n1' ,
126
+ 'parent' : {'id' : root .id , 'name' : 'root' ,
127
+ 'tag' : {'id' : a .id , 'tag' : 'a' }},
128
+ 'tag' : {'id' : a .id , 'tag' : 'a' }})
129
+ assertSerialization ('n2' , {
130
+ 'id' : n2 .id ,
131
+ 'name' : 'n2' ,
132
+ 'parent' : {'id' : root .id , 'name' : 'root' ,
133
+ 'tag' : {'id' : a .id , 'tag' : 'a' }},
134
+ 'tag' : {'id' : b .id , 'tag' : 'b' }})
135
+ assertSerialization ('root' , {
136
+ 'id' : root .id ,
137
+ 'name' : 'root' ,
138
+ 'parent' : None ,
139
+ 'tag' : {'id' : a .id , 'tag' : 'a' }})
140
+
94
141
def test_simple (self ):
95
142
with self .assertQueryCount (0 ):
96
143
self .assertEqual (model_to_dict (self .user ), {
0 commit comments