From d82340bcb1e6960a09f730d18b409fa098659115 Mon Sep 17 00:00:00 2001 From: collerek Date: Tue, 11 Aug 2020 18:11:34 +0200 Subject: [PATCH] refactors in foreign key --- .coverage | Bin 53248 -> 53248 bytes orm/__init__.py | 2 +- orm/fields/foreign_key.py | 51 ++++++++++++++++++++++++-------------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/.coverage b/.coverage index 52c345a480d2a4921903b810f9d261a68e88c907..105fceb53d64948024e1f0c6aae03edf3748d6b8 100644 GIT binary patch delta 914 zcmYjOZAepL6ux)wy_;8*HM1}T&qFh;hFUJp-RA7vE>6e34hZ~hmaY*1aY}q@TrEB^=|qzu zkKzGgSq7lhcC5A2UUs6l2Cd`;F%JU5y37-24Lr$-q_Ij>%8Cu9b$FVZv$uA4AMa|< z%1dO z!=4&B)EjZsD}LLo(<^V{F}$BoOokn<%pNHyJA0;rv8dA%iP&5VpFJ|U7GXvu8h)un zlwUXJq{+!T$Naa6z!cgFai;+$!k%QPcgpLZnsZC9lyr3It9N&D-lxRs6z@{3H|1nG z%1tu)T)f&AuN$(cS*(MsHcy9Rsm}Fm$vPx`Nt=6=Gs@r=qn0L_a~rg(kE2Vb`qaow z{Ql|o17{Pdvrla9hjQYlERRXHXgW0WIGNUuXWn=}nH8Vxm|pCeP@*wu)Rl-h+?fxt z(NyEY=cBNe!COwc8JBe3w($L6=8~i|`@&s`=+(7-a!0`-sU}*SloP=&Ihb6WnK!+S z&yVkorIW5yJ)eW6MLB~XI(K@)ZGnl-E>_2xeE1g77EseBg$^z2Y}gx@Ext delta 627 zcmYk1KWGzC9LHboy?b|;d++@&CbZB{HJO?;T-9rgcIx2hU6(>F*!+{E*is`6Me3lz zMbV}9O%cH^1sxP6;1ER-aZzzlx;SVz?N}#Wtna8Coxb1q;meQr>1^Q627c;|(b7cm z_(ZXHdhDw+_*1+PH$_Dh`5u4I@A5j&vA^tdFX237T0SAS{ZZmzG%Mc(LoydIy#yGo zsMmmeJ!Q+^XH!IAREt2>*R8gDd9}n3&Z>TjFpQR>S=V=njZrHCpL|CjiDNXQ$dH^4 zJne)jUj-g9Fq%^=!|JtmLml?${+*0`9Dp32`jvhuZiyXH6(`vqY_Tt}DG>j_*ZBpW zR~nC){605I5_vo;GnI7cK%7%}MLh=pDhMVMW}E zfHEL<4$ml%meb{N?BPY#v(RiUH!jX!sw_5E)m2mOmJ7t#Ka~w7dc&0;N3#G62>!q> z?7%nJg17JlHsL<3!)>?$S78|zl*}2pPJzTM0evdM6fWgq@;+r@GMCz6+GR7Y@=#pc z7KWvoV_mBlW?0O7IBBRdV&t#Hnz2dLseN?N8gZzCS^E5ZVc^cY`m=Kd*U-bgu1#7* pl@w_ Tuple[Union["Model", List["Model"]], bool]: + if isinstance(value, list) and not isinstance(value, self.to): + model = [self.expand_relationship(val, child) for val in value] + return model, True + + if isinstance(value, self.to): + model = value + else: + model = self.to(**value) + return model, False + + def construct_model_from_pk(self, value: Any) -> "Model": + if not isinstance(value, self.to.pk_type()): + raise RelationshipInstanceError( + f"Relationship error - ForeignKey {self.to.__name__} " + f"is of type {self.to.pk_type()} " + f"while {type(value)} passed as a parameter." + ) + return create_dummy_instance(fk=self.to, pk=value) + def expand_relationship( self, value: Any, child: "Model" ) -> Optional[Union["Model", List["Model"]]]: @@ -56,31 +78,22 @@ class ForeignKey(BaseField): if value is None: return None + is_sequence = False + if isinstance(value, orm.models.Model) and not isinstance(value, self.to): raise RelationshipInstanceError( f"Relationship error - expecting: {self.to.__name__}, " f"but {value.__class__.__name__} encountered." ) - if isinstance(value, list) and not isinstance(value, self.to): - model = [self.expand_relationship(val, child) for val in value] - return model - - if isinstance(value, self.to): - model = value - elif isinstance(value, dict): - model = self.to(**value) + if isinstance(value, (dict, list, self.to)): + model, is_sequence = self.extract_model_from_sequence(value, child) else: - if not isinstance(value, self.to.pk_type()): - raise RelationshipInstanceError( - f"Relationship error - ForeignKey {self.to.__name__} " - f"is of type {self.to.pk_type()} " - f"while {type(value)} passed as a parameter." - ) - model = create_dummy_instance(fk=self.to, pk=value) + model = self.construct_model_from_pk(value) - model._orm_relationship_manager.add_relation( - model, child, virtual=self.virtual, - ) + if not is_sequence: + model._orm_relationship_manager.add_relation( + model, child, virtual=self.virtual + ) return model