@@ -367,12 +367,15 @@ def _define_props_(self):
367367 setattr (self .__class__ , name , obj )
368368 self .fields .append (obj ._make_field (name , self ))
369369
370- def __find_matching_fk_definition (self , fields , rmodel ):
370+ def __find_matching_fk_definition (self , rfields , lfields , rmodel ):
371371 match = None
372- if not set (fields ).issubset (set (rmodel .primary_keys )):
372+ if not set (rfields ).issubset (set (rmodel .primary_keys )):
373373 return match
374374 for key , val in self .foreign_keys .items ():
375- if set (val ["foreign_fields" ]) == set (rmodel .primary_keys ):
375+ if (
376+ set (val ["foreign_fields" ]) == set (rmodel .primary_keys ) and
377+ set (lfields ).issubset (set (val ["fields" ]))
378+ ):
376379 match = key
377380 break
378381 return match
@@ -410,7 +413,7 @@ def _define_relations_(self):
410413 fk_def_key , fks_data , multi_fk = None , {}, []
411414 if ref_multi_pk and reference .fk :
412415 fk_def_key = self .__find_matching_fk_definition (
413- [reference .fk ], refmodel
416+ [reference .fk ], [ reference . name ], refmodel
414417 )
415418 if not fk_def_key :
416419 raise SyntaxError (
@@ -546,22 +549,23 @@ def __define_fks(self):
546549 ):
547550 continue
548551 if len (rmodel ._fieldset_pk ) > 1 :
549- match = self .__find_matching_fk_definition ([rel .fk ], rmodel )
552+ match = self .__find_matching_fk_definition ([rel .fk ], [ rel . name ], rmodel )
550553 if not match :
551554 raise SyntaxError (
552555 f"{ self .__class__ .__name__ } .{ rname } relation targets a "
553556 "compound primary key table. A matching foreign key "
554557 "needs to be defined into `foreign_keys`."
555558 )
556- trels = grouped_rels [rmodel . tablename ] = grouped_rels .get (
557- rmodel . tablename , {
559+ crels = grouped_rels [match ] = grouped_rels .get (
560+ match , {
558561 'rels' : {},
562+ 'table' : rmodel .tablename ,
559563 'on_delete' : self .foreign_keys [match ].get (
560564 "on_delete" , "cascade"
561565 )
562566 }
563567 )
564- trels ['rels' ][rname ] = rel
568+ crels ['rels' ][rname ] = rel
565569 else :
566570 # NOTE: we need this since pyDAL doesn't support id/refs types != int
567571 implicit_defs [rname ] = {
@@ -575,15 +579,15 @@ def __define_fks(self):
575579 rel ['table' ], * rel ['fields_local' ]
576580 )
577581 self ._foreign_keys_ [constraint_name ] = {** rel }
578- for tname , rels in grouped_rels .items ():
582+ for crels in grouped_rels .values ():
579583 constraint_name = self .__create_fk_contraint_name (
580- tname , * [rel .name for rel in rels ['rels' ].values ()]
584+ crels [ 'table' ] , * [rel .name for rel in crels ['rels' ].values ()]
581585 )
582586 self ._foreign_keys_ [constraint_name ] = {
583- 'table' : tname ,
584- 'fields_local' : [rel .name for rel in rels ['rels' ].values ()],
585- 'fields_foreign' : [rel .fk for rel in rels ['rels' ].values ()],
586- 'on_delete' : Field ._internal_delete [rels ['on_delete' ]]
587+ 'table' : crels [ 'table' ] ,
588+ 'fields_local' : [rel .name for rel in crels ['rels' ].values ()],
589+ 'fields_foreign' : [rel .fk for rel in crels ['rels' ].values ()],
590+ 'on_delete' : Field ._internal_delete [crels ['on_delete' ]]
587591 }
588592
589593 def _define_virtuals_ (self ):
0 commit comments