Skip to content

Commit 5d38c24

Browse files
committed
Merge branch 'master' into release
2 parents 4684473 + 7014464 commit 5d38c24

File tree

3 files changed

+20
-16
lines changed

3 files changed

+20
-16
lines changed

emmett/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "2.5.12"
1+
__version__ = "2.5.13"

emmett/orm/models.py

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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):

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ name = "emmett"
33

44
[tool.poetry]
55
name = "emmett"
6-
version = "2.5.12"
6+
version = "2.5.13"
77
description = "The web framework for inventors"
88
authors = ["Giovanni Barillari <g@baro.dev>"]
99
license = "BSD-3-Clause"

0 commit comments

Comments
 (0)